view()和reshape()
不是转置的效果,而是相当于将原tensor的元素按行取出,然后按行放入到新形状的tensor中。
- 相同之处
都可以用来重新调整tensor
的形状。 - 不同之处
view
函数只能用于contiguous
后的tensor
上,也就是只能用于内存中连续存储的tensor
。如果对 tensor 调用过transpose
,permute
等操作的话会使该 tensor 在内存中变得不再连续,此时就不能再调用 view 函数。因此,需要先使用 contiguous 来返回一个 contiguous copy。
- 判断ternsor是否为contiguous,可以调用
torch.Tensor.is_contiguous()
函数:
import torch
x = torch.ones(10, 10)
x.is_contiguous() # True
x.transpose(0, 1).is_contiguous() # False
x.transpose(0, 1).contiguous().is_contiguous() # True
reshape
则不需要依赖目标 tensor 是否在内存中是连续的。- 所以
reshape可以用来替换view
tensor.contiguous().view()
=tensor.reshape()
In [20]: a
Out[20]:
tensor([[0, 1, 2],
[3, 4, 5]])
In [21]: a.permute(1,0)
Out[21]:
tensor([[0, 3],
[1, 4],
[2, 5]])
In [22]: a.reshape(3,2)
Out[22]:
tensor([[0, 1],
[2, 3],
[4, 5]])
In [23]: a.view(3,2)
Out[23]:
tensor([[0, 1],
[2, 3],
[4, 5]])
permute和transpose
转置:行变为列;列变为行.
- permute:将tensor维度换位
- 只能用
Tensor.permute()
- 不能用torch.permute()
- 可以对任意高维矩阵进行转置
- 参数是
desired ordering of dimensions
期望的维度顺序 - 可以理解为,对于一个高维的
Tensor
执行permute
,我们没有改变数据的相对位置,而只是旋转了一下这个(超)立方体。或者也可以说,改变了我们对这个(超)立方体的“观察角度”而已。
- 只能用
>>> x = torch.randn(2, 3, 5)
>>> x.size()
torch.Size([2, 3, 5])
>>> x.permute(2, 0, 1).size()
torch.Size([5, 2, 3])
- transpose
- 只能操作2D矩阵的转置。
- 有两种调用方式。
- 连续使用transpose也可实现permute的效果。
t.rand(2,3,4,5).transpose(1,0).transpose(2,1).transpose(3,1).shape
Out[670]: torch.Size([3, 5, 2, 4])