准研究生,学习一些研究生阶段需要的预备知识,打好深度学习基础。共34节课。
课程安排
相关资源:
课程主页:https://courses.d2l.ai/zh-v2
教材:https://zh-v2.d2l.ai/
课程论坛讨论:https://discuss.d2l.ai/c/16
Pytorch论坛:https://discuss.pytorch.org/
数据操作
数据的一些基本操作
1. 访问元素
一个元素 [1, 2]、一行 [1, :]、一列 [:, 1]
子区域 [1:3, 1:]:访问第1到第2行,第2到最后一列的子区域
子区域 [::3, ::2]:每三行一跳,每两列一跳的所有元素构成的子区域
2. 张量及其基本操作
张量表示一个数值组成的数组,这个数组可能有多个维度。
1 2 3
| x = torch.arange(12)
tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
|
x.shape
访问张量的形状
x.numel()
访问张量中元素的个数
X = x.reshape(3, 4)
改变张量的形状而不改变元素数量和值
torch.zeros((2, 3, 4))
创建三维全0的2x3x4的张量
torch.ones((2, 3, 4))
创建三维全0的2x3x4的张量
torch.tensor([[1, 2, 3, 4], [5, 6, 7, 8]])
创建指定张量
X.sum()
对张量中所有元素进行求和
按元素基本运算
1 2 3 4 5 6 7 8 9 10
| x = torch.tensor([1.0, 2, 4, 8]) y = torch.tensor([2, 2, 2, 2]) x + y, x - y, x * y, x / y, x**y, torch.exp(x)
tensor([ 3., 4., 6., 10.]) tensor([-1., 0., 2., 6.]) tensor([ 2., 4., 8., 16.]) tensor([ 0.5000, 1.0000, 2.0000, 4.0000]) tensor([ 1., 4., 16., 65.])
|
多个张量连结
1 2 3 4
| 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]]) torch.cat((X, Y), dim=0) torch.cat((X, Y), dim=1)
|
通过逻辑运算符构建二元张量
1 2 3 4 5
| X == Y
tensor([[False, True, False, True], [False, False, False, False], [False, False, False, False]])
|
广播机制
1 2 3 4 5 6 7
| a = torch.arange(3).reshape((3, 1)) b = torch.arange(2).rashape((1, 2)) a + b
tensor([[0, 1], [1, 2], [2, 3]])
|
运行一些操作可能导致为新结果分配内存
1 2 3 4 5
| before = id(Y) Y = Y + X id(Y) == before
False
|
执行原地操作
1 2 3 4 5 6 7
| Z = torch.zeros_like(Y) print(id(Z)) Z[:] = X + Y print(id(Z))
140146615319872 140146615319872
|
如果在后续计算中没有重复使用X, 我们也可以使用 X[:] = X + Y
或 X += Y
来减少操作的内存开销。
1 2 3 4 5 6
| before = id(X) X += Y id(X) == before
True
|
简单的数据预处理
创建一个人工数据集,并存储在csv(逗号分隔值)文件
1 2 3 4 5 6 7 8 9 10
| 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,Price\n') f.write('NA,Pave,127500\n') f.write('2,NA,106000\n') f.write('4,NA,178100\n') f.write('NA,NA,140000\n')
|
1 2 3
| import pandas as pd
data = pd.read_csv(data_file)
|
1 2 3 4 5 6 7
| inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]
inputs = inputs.fillna(inputs.mean()) print(inputs)
inputs = pd.get_dummies(inputs, dummy_na=True) print(inputs)
|
现在inputs和outputs中的所有条目都是数值类型,他们可以转换为张量格式
1 2
| import torch X, y = torch.tensor(inputs.values), torch.tensor(outputs.values)
|