pytorch学习日记(2)
学习参考:菜鸟教程
张量
维度由[]决定,一层[]就是一维。
基本操作
| 操作 | 说明 | 示例代码 |
|---|---|---|
| +, -, *, / | 元素级加法、减法、乘法、除法。 | z = x + y |
| torch.matmul(x, y) | 矩阵乘法。 | z = torch.matmul(x, y) |
| torch.dot(x, y) | 向量点积(仅适用于 1D 张量)。 | z = torch.dot(x, y) |
| torch.sum(x) | 求和。 | z = torch.sum(x) |
| torch.mean(x) | 求均值。 | z = torch.mean(x) |
| torch.max(x) | 求最大值。 | z = torch.max(x) |
| torch.min(x) | 求最小值。 | z = torch.min(x) |
| torch.argmax(x, dim) | 返回最大值的索引(指定维度)。 | z = torch.argmax(x, dim=1) |
| torch.softmax(x, dim) | 计算 softmax(指定维度)。 | z = torch.softmax(x, dim=1) |
这个torch.argmax(x, dim)想了一下午终于知道怎么计算的了,这里只写规律,具体的实例大家自己写一个简单的就可以验证了。
- 一维:dim = 0 时,选取向量中的最大值,大小为1;
- 二维(m * n):dim = 0 时,每个向量中各元素逐次比大小,选取最大值,大小为 1 * n;
dim = 1 时,在每个向量中选取最大值,大小为 1 * m; - 三维(v * m * n):dim = 0 时,每个矩阵中各元素逐次比大小,选取最大值,大小为 m * n;
dim = 1 时,在每个矩阵中的每个向量个元素逐次比较,选取最大值,大小为 v * n;
dim = 2 时,选取每个向量中元素的最大值,大小为 v * m; - 四维(q * v * m * n):dim = 0 时,选取每个三维数据中的各矩阵中各元素比较,选取最大值,大小为 v * m * n;
dim = 1 时,每个矩阵中各元素逐次比大小,选取最大值,大小为 q * m * n;
······
从中也可以发现规律,选择哪个维度,这个维度上的特征就逐个比大小,形状就是其他维度的特征数相乘。搞明白之后感觉还挺简单的,但是一开始确实没有搞懂。
形状操作
| 操作 | 说明 | 示例代码 |
|---|---|---|
| x.view(shape) | 改变张量的形状(不改变数据)。 | z = x.view(3, 4) |
| x.reshape(shape) | 类似于 view,但更灵活。 | z = x.reshape(3, 4) |
| x,flatten() | 将张量平摊为一维 | |
| x.t() | 转置矩阵。 | z = x.t() |
| x.unsqueeze(dim) | 在指定维度添加一个维度。 | z = x.unsqueeze(0) |
| x.squeeze(dim) | 去掉指定维度为 1 的维度。 | z = x.squeeze(0) |
| torch.cat((x, y), dim) | 按指定维度连接多个张量。 | z = torch.cat((x, y), dim=1) |
注意:
reshape不能损失值,元素个数要和变换前相同。
squeeze只删除长度为1的维度,否则不发生改变
示例:
点击查看代码
x = torch.randn(1, 2, 1)
print(x)
print(x.squeeze(0))
print(x.squeeze(2))
##
结果:
tensor([[[0.1409],
[0.7517]]])
tensor([[0.1409],
[0.7517]])
tensor([[0.1409, 0.7517]])
##
张量与numpy的转换
| 操作 | 说明 | 示例代码 |
|---|---|---|
| torch.from_numpy(ndarray) | 将 NumPy 数组转换为张量。 | x = torch.from_numpy(np_array) |
| x.numpy() | 将张量转换为 NumPy 数组(仅限 CPU 张量)。 | np_array = x.numpy() |
一般情况下,张量和其对应的numpy数组是同步变化的,但是使用了clone()函数后就不同步了。
浙公网安备 33010602011771号