动手学深度学习
基本操作
创建tensor,输出大小
# 导入torch
import torch
# 使用arange 创建一个行向量
x = torch.arange(12) # 创建了一个[0,12)包含12个元素的张量
--> output:tensor([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
y = torch.arange(5,12) # 创建了一个[5,12)的张量
# 使用shape访问张量的形状
x.shape
--> output:torch.Size([12])
# 使用numel查看张量元素的综述,即形状的所有元素成绩
x.numel()
--> output:12
# 使用reshape改变张量形状,可以看出来其实x的形状没变,只是赋值给了X
X = x.shape(3,4)
X
# 使用torch.zeros()创建全为0的矩阵
torch.zeros((2, 3, 4))
--> output:
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.]]])
# 使用torch.ones()创建全为1的矩阵
torch.zeros((2, 3, 4))
# 使用torch.randn()创建随机采样的值
torch.randn(3, 4)
# 当然也可以直接对tensor赋值
torch.tensor([[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])
运算操作
加减乘除。
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 # **运算符是求幂运算
连接操作concatenate
将两个相同size的tensor使用torch.cat()连接起来,其中dim 表示沿哪个轴连接
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=0 和 dim=1
torch.cat((X, Y), dim=0), torch.cat((X, Y), dim=1)
# 通过逻辑运算符构建二元张量
X == Y
-output:
tensor([[False, True, False, True],
[False, False, False, False],
[False, False, False, False]])
# 通过X.sum()对tensor中的元素进行求和
X.sum()
广播机制
索引&切片
X[-1]:切的是最后一个
X[1:3]: 切的是[1:3),也就是第1个和第2个元素
X[1,2]=9: 对该位置进行元素写入
X[0:2,:]=12: 对第0行和第1行的所有列均赋值12
数据预处理
读取数据集
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')
# 使用pd.read_csv()读取数据集
data = pd.read_csv(data_file)
NumRooms Alley Price
0 NaN Pave 127500
1 2.0 NaN 106000
2 4.0 NaN 178100
3 NaN NaN 140000
# 使用data.iloc()对数据集的输入和输出切割
inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]
# 使用inputs.fillna()对NAN值进行填充
inputs = inputs.fillna(inputs.mean())
NumRooms Alley
0 3.0 Pave
1 2.0 NaN
2 4.0 NaN
3 3.0 NaN
# 将Alley列分成两列
inputs = pd.get_dummies(inputs, dummy_na=True)
NumRooms Alley_Pave Alley_nan
0 3.0 1 0
1 2.0 0 1
2 4.0 0 1
3 3.0 0 1
# 将他们转换成tensor格式,以方便后续处理
X, y = torch.tensor(inputs.values), torch.tensor(outputs.values)
(tensor([[3., 1., 0.],
[2., 0., 1.],
[4., 0., 1.],
[3., 0., 1.]], dtype=torch.float64),
tensor([127500, 106000, 178100, 140000]))
总结
简单的Python复健。。。。