环境配置 - 本地安装
代码语言: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 |
# 处理缺失的数据 - 插值和删除
# 一种常用的是,有缺失就丢掉
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 |
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 |
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]))