动手学深度学习v2 - Pytorch基础使用和数据操作

本文最后更新于 2021年4月13日 凌晨

数据操作

创建一个张量(可理解为向量)

1
x = torch.arange(12)

获取张量的形状

1
x.shape

获取张量的元素总数

1
x.numel()

改变张量形状

1
x = x.reshape(3,4)

生成全1的张量

1
torch.ones((2,3,4))

生成全0的张量

1
torch.zeros((2,3,4))

生成随机数,从标准正态分布中抽取(均值=0,方差=1)

1
torch.randn(3,4)

生成随机数,从均匀分布中抽取范围 [0,1)

1
torch.zeros((2,3,4))

张量可由列表赋值

1
torch.tensor([[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])

张量可进行python的基本数值运算

1
2
3
4
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) # 计算e^x

张量的连接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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) #第0维合并 按行
torch.cat((X, Y), dim=1) #第1维合并,按列


结果:
(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.]]))

构建二元张量(True,False)

1
X == Y

对张量所有元素求和

1
x.sum()

广播机制

1
2
3
a = torch.arange(3).reshape((3, 1))
b = torch.arange(2).reshape((1, 2))
a+b

a复制为(3, 1*2),b复制为(1*3, 2),形状相同,可以运算

索引和切片

索引行

1
2
X[-1] # 最后一行
X[1:3] # 第2行-第3行(<第4行)

指定赋值

1
X[1,2] = 9

多个元素赋值

1
2
X[0:2, :] = 12
# 选中1-2行,所有列

看似没什么用但能节约内存的操作

执行原地操作(省内存?)

1
2
3
4
5
6
Z = torch.zeros_like(Y)
print('id(Z):', id(Z))
Z[:] = X + Y
print('id(Z):', id(Z))

# 内存地址不变

或者使用如下操作省内存

1
X+=Y

转换为其他Python对象

numpy, torch相互转换

1
2
3
A = X.numpy() # torch转numpy
B = torch.tensor(A) # numpy转torch
type(A), type(B)

将大小为1的张量转换为 Python 标量(获取元素值)

1
2
3
4
a = torch.tensor([3.5])
a # tensor
a.item() # python对象
float(a), int(a) # 类型转换

数据预处理

pandas读取csv

1
data = pd.read_csv(文件路径)

处理缺失值

1
2
3
inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2] # 索引,和pytorch类似
inputs = inputs.fillna(inputs.mean()) # 用同一列的均值替换NaN项(String不替换)
print(inputs)

对于 inputs 中的类别值或离散值,将 “NaN” 视为一个类别,类似于One-Hot编码

1
inputs = pd.get_dummies(inputs, dummy_na=True)

pandas对象转换为张量,都是数值

1
X, y = torch.tensor(inputs.values), torch.tensor(outputs.values)

动手学深度学习v2 - Pytorch基础使用和数据操作
https://nanami.run/2021/04/04/d2l-pytorch-preliminary/
作者
Nanami
发布于
2021年4月4日
许可协议