这里整理一下各种工具方法。
修改维度
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 | a = torch.arange(4.) |
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]]]])