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的博客