【学习笔记】动手学深度学习

2023-04-01 11:08:48 浏览数 (1)

环境配置 - 本地安装

代码语言:javascript复制
# 以下操作处于conda环境下

conda env list # 查看建立过的环境
conda env remove d2l-zh # 如果发现建立过名为d2l-zh的环境可以删掉重建
conda create -n d2l-zh python=3.8 # 建立名字为d2l-zh的环境
conda activate d2l-zh # 激活刚刚创建的环境

# 下载需要的包 (下载比较慢可以加上国内源 -i https://pypi.douban.com/simple)
pip install jupyter d2l torch torchvision 

# 下载代码
wget https://zh-v2.d2l.ai/d2l-zh.zip 
unzip d2l-zh.zip
jupyter notebook

数据操作

代码语言:javascript复制
import torch

# 张量
x = torch.arange(12)
x
代码语言:javascript复制
tensor([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
代码语言:javascript复制
# shape属性,访问形状和元素总数
x.shape
代码语言:javascript复制
torch.Size([12])
代码语言:javascript复制
# number of elements
x.numel()
代码语言:javascript复制
12
代码语言:javascript复制
X = x.reshape(3, 4)
X
代码语言:javascript复制
tensor([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]])
代码语言:javascript复制
# 产生全为0的2*3*4
torch.zeros((2, 3, 4))
代码语言:javascript复制
tensor([[[0., 0., 0., 0.],
         [0., 0., 0., 0.],
         [0., 0., 0., 0.]],

        [[0., 0., 0., 0.],
         [0., 0., 0., 0.],
         [0., 0., 0., 0.]]])
代码语言:javascript复制
# # 产生全为1的2*3*4
torch.ones((2, 3, 4))
代码语言:javascript复制
tensor([[[1., 1., 1., 1.],
         [1., 1., 1., 1.],
         [1., 1., 1., 1.]],

        [[1., 1., 1., 1.],
         [1., 1., 1., 1.],
         [1., 1., 1., 1.]]])
代码语言:javascript复制
# 特定的一个值
torch.tensor([[[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]]])
代码语言:javascript复制
tensor([[[2, 1, 4, 3],
         [1, 2, 3, 4],
         [4, 3, 2, 1]]])
代码语言:javascript复制
torch.tensor([[[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]]]).shape
代码语言:javascript复制
torch.Size([1, 3, 4])
代码语言:javascript复制
# 计算
x = torch.tensor([1.0, 2, 4, 8])
y = torch.tensor([2, 2, 2, 3])
x y, x-y, x*y, x/y, x**y
代码语言:javascript复制
(tensor([ 3.,  4.,  6., 11.]),
 tensor([-1.,  0.,  2.,  5.]),
 tensor([ 2.,  4.,  8., 24.]),
 tensor([0.5000, 1.0000, 2.0000, 2.6667]),
 tensor([  1.,   4.,  16., 512.]))
代码语言:javascript复制
# 更多的运算
torch.exp(x)
代码语言:javascript复制
tensor([2.7183e 00, 7.3891e 00, 5.4598e 01, 2.9810e 03])
代码语言:javascript复制
# 将张量连结起来
X = torch.arange(12, dtype=torch.float32).reshape(3, 4)
Y = torch.tensor([[2.0, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])
# dim 按第i维合并
torch.cat((X, Y), dim=0), torch.cat((X, Y), dim=1)
代码语言:javascript复制
(tensor([[ 0.,  1.,  2.,  3.],
         [ 4.,  5.,  6.,  7.],
         [ 8.,  9., 10., 11.],
         [ 2.,  1.,  4.,  3.],
         [ 1.,  2.,  3.,  4.],
         [ 4.,  3.,  2.,  1.]]),
 tensor([[ 0.,  1.,  2.,  3.,  2.,  1.,  4.,  3.],
         [ 4.,  5.,  6.,  7.,  1.,  2.,  3.,  4.],
         [ 8.,  9., 10., 11.,  4.,  3.,  2.,  1.]]))
代码语言:javascript复制
# 按照元素值进行判断
X == Y
代码语言:javascript复制
tensor([[False,  True, False,  True],
        [False, False, False, False],
        [False, False, False, False]])
代码语言:javascript复制
# 对张量中的所用元素求
X.sum()
代码语言:javascript复制
tensor(66.)
代码语言:javascript复制
# 维度一样,形状不同,复制拓展成一样再加(广播机制)
a = torch.arange(3).reshape((3, 1))
b = torch.arange(2).reshape((1, 2))
a, b, a b
代码语言:javascript复制
(tensor([[0],
         [1],
         [2]]),
 tensor([[0, 1]]),
 tensor([[0, 1],
         [1, 2],
         [2, 3]]))
代码语言:javascript复制
# 读取
X[-1], X[1:3]
代码语言:javascript复制
(tensor([ 8.,  9., 10., 11.]),
 tensor([[ 4.,  5.,  6.,  7.],
         [ 8.,  9., 10., 11.]]))
代码语言:javascript复制
#写入
X[1, 2] = 9
X
代码语言:javascript复制
tensor([[ 0.,  1.,  2.,  3.],
        [ 4.,  5.,  9.,  7.],
        [ 8.,  9., 10., 11.]])
代码语言:javascript复制
X[0:2, :] = 12
X
代码语言:javascript复制
tensor([[12., 12., 12., 12.],
        [12., 12., 12., 12.],
        [ 8.,  9., 10., 11.]])
代码语言:javascript复制
# 有些操作不是原地操作 id 相当于C  的指针地址
before = id(Y)
Y = Y X
id(Y) == before
代码语言:javascript复制
False
代码语言:javascript复制
# 原地操作
Z = torch.zeros_like(Y)
print('id(Z):', id(Z))
Z[:] = X Y
print('id(Z):', id(Z))
代码语言:javascript复制
id(Z): 1988936663664
id(Z): 1988936663664
代码语言:javascript复制
# 后续没有重复使用X,减少内存开销
before = id(X)
X  = Y
id(X) == before
代码语言:javascript复制
True
代码语言:javascript复制
# NumPy张量
A = X.numpy()
B = torch.tensor(A)
type(A), type(B)
代码语言:javascript复制
(numpy.ndarray, torch.Tensor)
代码语言:javascript复制
# 大小为1的张量转外为Python的标量
a = torch.tensor([3.5])
a, a.item(), float(a), int(a)
代码语言:javascript复制
(tensor([3.5000]), 3.5, 3.5, 3)

数据预处理

代码语言:javascript复制
# 创建一个人工数据集,存在csv中
import os
os.makedirs(os.path.join('..', 'data'), exist_ok=True)
data_file = os.path.join('..', 'data', 'house_tiny.csv')
with open(data_file, 'w') as f:
    f.write('NumRooms, Alley, Pricen') # 列名
    f.write('NA, Pave, 127500n') # 样本
    f.write('2, NA, 107500n')
    f.write('4, NA, 185500n')
    f.write('NA, NA, 140000n')
代码语言:javascript复制
# 读取csv文件 - pandas
import pandas as pd

data = pd.read_csv(data_file)
data

NumRooms

Alley

Price

0

NaN

Pave

127500

1

2.0

NA

107500

2

4.0

NA

185500

3

NaN

NA

140000

代码语言:javascript复制
# 处理缺失的数据 - 插值和删除
# 一种常用的是,有缺失就丢掉
inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]
inputs = inputs.fillna(inputs.mean())
# 因为第二行是字符串,不存在均值,没有发生变化
inputs

NumRooms

Alley

0

3.0

Pave

1

2.0

NA

2

4.0

NA

3

3.0

NA

代码语言:javascript复制
inputs = pd.get_dummies(inputs, dummy_na=True)
inputs

NumRooms

Alley_ NA

Alley_ Pave

Alley_nan

0

3.0

0

1

0

1

2.0

1

0

0

2

4.0

1

0

0

3

3.0

1

0

0

代码语言:javascript复制
import torch

X, Y = torch.tensor(inputs.values), torch.tensor(outputs.values)
X, Y
代码语言:javascript复制
(tensor([[3., 0., 1., 0.],
         [2., 1., 0., 0.],
         [4., 1., 0., 0.],
         [3., 1., 0., 0.]], dtype=torch.float64),
 tensor([127500, 107500, 185500, 140000]))

0 人点赞