0%

torch | 各种工具方法

这里整理一下各种工具方法。


修改维度


squeeze

torch.squeeze() 这个函数主要对数据的维度进行压缩,去掉维数为1的的维度,比如是一行或者一列这种,一个一行三列(1,3)的数去掉第一个维数为一的维度之后就变成(3)行。squeeze(a)就是将a中所有为1的维度删掉。不为1的维度没有影响。a.squeeze(N) 就是去掉a中指定的维数为一的维度。还有一种形式就是b=torch.squeeze(a,N) a中去掉指定的定的维数为一的维度。

1
2
3
4
x = torch.rand((2, 1, 3))
print(x.size())
x = x.squeeze(1)
print(x.size())

输出

1
2
torch.Size([2, 1, 3])
torch.Size([2, 3])

假设数据中没有维度 1,不会对维度作出变化。

1
2
3
4
x = torch.rand((2, 3))
print(x.size())
x = x.squeeze(1)
print(x.size())

输出

1
2
torch.Size([2, 3])
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
2
3
4
x = torch.rand((2, 3))
print(x.size())
x = x.unsqueeze(1)
print(x.size())

输出

1
2
torch.Size([2, 3])
torch.Size([2, 1, 3])

改变形状


reshape

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
>>> a = torch.arange(4.)
>>> torch.reshape(a, (2, 2))
tensor([[ 0., 1.],
[ 2., 3.]])
>>> b = torch.tensor([[0, 1], [2, 3]])
#只有一个-1的话,就是直接展开
>>> torch.reshape(b, (-1,))
tensor([ 0, 1, 2, 3])
#给定一个的时候,另外一个就能就算出来
>>> torch.reshape(b, (-1, 2))
tensor([[0, 1],
[2, 3]])
>>> b = torch.tensor([[[0, 1], [2, 3]], [[0, 1], [2, 3]], [[0, 1], [2, 3]]])
>>> torch.reshape(b, (-1, 2, -1))
RuntimeError: only one dimension can be inferred
>>> torch.reshape(b, (2, 2, -1))
tensor([[[0, 1, 2],
[3, 0, 1]],

[[2, 3, 0],
[1, 2, 3]]])

view


拼接


cat

参数

  • inputs : 待连接的张量序列,可以是任意相同Tensor类型的python 序列
  • dim : 选择的扩维, 必须在0len(inputs[0])之间,沿着此维连接张量序列。

相乘


mul 点乘

  • 同一纬度
1
2
3
4
a = torch.from_numpy(np.array([[1, 2], [3, 4]]))
b = torch.from_numpy(np.array([[1, 2], [3, 4]]))

print(torch.mul(a, b))

输出

tensor([[ 1,  4],
        [ 9, 16]])
  • 不同维度
1
2
3
4
a = torch.from_numpy(np.array([[1, 2], [3, 4]]))
b = torch.from_numpy(np.array([[1, 2]]))

print(torch.mul(a, b))

输出

tensor([[1, 4],
        [3, 8]])
1
2
3
4
5
a = torch.from_numpy(np.array([[[[1, 2]]], [[[3, 4]]]]))
b = torch.from_numpy(np.array([[1, 2], [2, 4]]))

c = torch.mul(a, b)
print(torch.mul(a, b))
  • 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
2
3
4
5
a = torch.from_numpy(np.array([[[[1, 2]]], [[[3, 4]]]]))
b = torch.from_numpy(np.array([[1, 2], [2, 4]]))

c = torch.mul(a, b.reshape((2, 1, 1, 2)))
print(c)
  • a shape 2,1,1,2
  • b shape 2,2
  • c shape 2,1,1,2

输出为

tensor([[[[ 1,  4]]],
        [[[ 6, 16]]]])
请我喝杯咖啡吧~