这里整理一下各种工具方法。
修改维度
squeeze
torch.squeeze()
这个函数主要对数据的维度进行压缩,去掉维数为1的的维度,比如是一行或者一列这种,一个一行三列(1,3)
的数去掉第一个维数为一的维度之后就变成(3)
行。squeeze(a)
就是将a
中所有为1
的维度删掉。不为1
的维度没有影响。a.squeeze(N)
就是去掉a
中指定的维数为一的维度。还有一种形式就是b=torch.squeeze(a,N)
a
中去掉指定的定的维数为一的维度。
1 | x = torch.rand((2, 1, 3)) |
输出
1 | torch.Size([2, 1, 3]) |
假设数据中没有维度 1,不会对维度作出变化。
1 | x = torch.rand((2, 3)) |
输出
1 | torch.Size([2, 3]) |
unsqueeze
torch.unsqueeze()
这个函数主要是对数据维度进行扩充。给指定位置加上维数为一的维度,比如原本有个三行的数据(3)
,在0
的位置加了一维就变成一行三列(1,3)
。a.squeeze(N)
就是在a
中指定位置N
加上一个维数为1
的维度。还有一种形式就是b=torch.squeeze(a,N)
a
就是在a
中指定位置N
加上一个维数为1
的维度。
1 | x = torch.rand((2, 3)) |
输出
1 | torch.Size([2, 3]) |
改变形状
reshape
1 | 4.) a = torch.arange( |
view
拼接
cat
参数
inputs
: 待连接的张量序列,可以是任意相同Tensor
类型的python
序列dim
: 选择的扩维, 必须在0
到len(inputs[0])
之间,沿着此维连接张量序列。
相乘
mul 点乘
- 同一纬度
1 | a = torch.from_numpy(np.array([[1, 2], [3, 4]])) |
输出
tensor([[ 1, 4],
[ 9, 16]])
- 不同维度
1 | a = torch.from_numpy(np.array([[1, 2], [3, 4]])) |
输出
tensor([[1, 4],
[3, 8]])
1 | a = torch.from_numpy(np.array([[[[1, 2]]], [[[3, 4]]]])) |
- a shape 2,1,1,2
- b shape 2,2
- c shape 2,1,2,2
输出为
tensor([[[[ 1, 4],
[ 2, 8]]],
[[[ 3, 8],
[ 6, 16]]]])
之所以输出这样的结果,可以看下面的极端例子,其原理是广播机制。
关于这个如何扩充的,可以参考
但是,我们就是想点乘,而不是想扩展维度,可以这样写
1 | a = torch.from_numpy(np.array([[[[1, 2]]], [[[3, 4]]]])) |
- a shape 2,1,1,2
- b shape 2,2
- c shape 2,1,1,2
输出为
tensor([[[[ 1, 4]]],
[[[ 6, 16]]]])