1.torch.size ()

这个函数可以看到变换后的矩阵的维度,用法如下:

>>>import torch

>>>a = torch.Tensor([[[1, 2, 3], [4, 5, 6]]])

>>>a.size()

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

记忆方法:第一层括号有1个元素,第二个括号有两个元素,第三个括号有3个元素。因此torch.Size([1, 2, 3])。

2.torch.view()

#将tensor变成一维向量的六个元素
a=torch.Tensor([[[1,2,3],[4,5,6]]])
b=torch.Tensor([1,2,3,4,5,6])

print(a.view(1,6))
print(b.view(1,6))

结果:
>>> print(a.view(1,6))
tensor([[1., 2., 3., 4., 5., 6.]])
>>> print(b.view(1,6))
tensor([[1., 2., 3., 4., 5., 6.]])

#将tensor变成三维向量的两个元素

a=torch.Tensor([[[1,2,3],[4,5,6]]])
print(a.view(3,2))

结果:
tensor([[1., 2.],
        [3., 4.],
        [5., 6.]])
按顺序填充想要的形状即可。简单说,把原本的tensor尺寸,转变为你想要的尺寸,例如原尺寸为23,现在可以转为32或16等,但一定要保证等式成立,不能目标尺寸为33。

# 也可以设其中一个尺寸为-1,表示机器内部自己计算,但同时只能有一个为-1。
>>> b=a.view(-1, 3, 2)
结果:
>>> b=a.view(-1, 3, 2)
>>> b
tensor([[[1., 2.],
         [3., 4.],
         [5., 6.]]])

>>> b.size()

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

3.torch.squeeze() / torch.unsqueeze()

torch.squeeze(n)函数表示压缩tensor中第n维为1的维数,比如下面第一个,b.squeeze(2).size(),原始的b为上面的torch.Size([1, 3, 2]),第二维是2≠1,所以不压缩,尺寸保持不变;而若b.squeeze(0).size(),则发现第一维为1,因此压缩为3x2的tensor。

>>> b.squeeze(2).size()

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

>>> b.squeeze(0).size()

torch.Size([3, 2])

相反的,torch.unsqueeze(n)则是在第n维增加一个维数=1,如下,表示在原始的b的第二维增加一维,则尺寸变为1 * 3 * 1 * 2

>>> b.unsqueeze(2).size()

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

>>> b.unsqueeze(2)

tensor([[[[1., 2.]],

         [[3., 4.]],

         [[5., 6.]]]])

4.torch.permute()

这个函数表示,将原始的tensor,按照自己期望的位置重新排序,例如原始tensor的第0、1、2维分别是1、3、2,那么当我执行permute(2, 0, 1),则将第三维放在最前,第一维放在中间,第二维放在最后,也就变成了2 * 1 * 3,注意这里表示的维数的index,而不是具体几维:

>>> b.permute(2, 0, 1).size()

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

>>> b.permute(2, 0, 1)

tensor([[[1., 3., 5.]],

        [[2., 4., 6.]]])

5、d = a.reshape()(numpy)

reshape 和view方法的结果是一致的,但是view没有开辟新的内存空间,而reshape开辟了新的内存空间。尽管reshape开辟了新的内存空间,但是指向的底层元素地址依旧没有变换,也就是说,对d的操作会影响到a。

>>> a = torch.randn(1,2,3,4);c = a.view(1,2,4,3);d = a.reshape(1,2,4,3);d[0] = d[0]+100
>>> print(a);print(c);print(d)
tensor([[[[ 98.9884, 100.3126, 100.1080, 100.9985],
          [ 98.7266,  99.6018,  99.7091,  99.8873],
          [ 99.3046, 101.0818, 101.1941, 102.0141]],

         [[ 97.7654,  99.8276, 101.9234,  99.4267],
          [101.3833, 100.2508, 100.2760,  99.7586],
          [ 99.0263, 101.2888, 101.2180, 100.0506]]]])
tensor([[[[ 98.9884, 100.3126, 100.1080],
          [100.9985,  98.7266,  99.6018],
          [ 99.7091,  99.8873,  99.3046],
          [101.0818, 101.1941, 102.0141]],

         [[ 97.7654,  99.8276, 101.9234],
          [ 99.4267, 101.3833, 100.2508],
          [100.2760,  99.7586,  99.0263],
          [101.2888, 101.2180, 100.0506]]]])
tensor([[[[ 98.9884, 100.3126, 100.1080],
          [100.9985,  98.7266,  99.6018],
          [ 99.7091,  99.8873,  99.3046],
          [101.0818, 101.1941, 102.0141]],

         [[ 97.7654,  99.8276, 101.9234],
          [ 99.4267, 101.3833, 100.2508],
          [100.2760,  99.7586,  99.0263],
          [101.2888, 101.2180, 100.0506]]]])

【参考】

科学网—pytorch中与维度/变换相关的几个函数(torch.squeeze() / torch.unsqueeze()) - 张伟的博文

PyTorch中view的用法_york1996的博客

pytorch常用总结 之 tensor维度变换 - 知乎