这里以
一、先来说一说reshape 和view 之间的区别
相同点:都是可以改变
不同点:
-
.view() 方法只能改变连续的(contiguous)张量,否则需要先调用.contiguous() 方法;而.reshape() 方法不受此限制;如果对 tensor 调用过transpose ,permute 等操作的话会使该 tensor 在内存中变得不再连续。 -
.view() 方法返回的张量与原张量共享基础数据(存储器,注意不是共享内存地址);.reshape() 方法返回的可能是原张量的copy,也可能不是,这个我们不知道。
下面举个例子说明一下第一个不同点:
1 2 3 4 5 6 7 8 9 10 | import torch x = torch.randn(3, 4) print(x.shape) x=x.permute(1,0) print(x.shape) ''' 输出:torch.Size([3, 4]) torch.Size([4, 3]) ''' |
查看该tensor是否连续:
1 2 3 4 | print(x.is_contiguous()) ''' 输出:False ''' |
非连续的情况下使用
- view
1 | x.view(3,4) |
- reshape
1 2 3 4 5 | x.reshape(3,4) x.shape ''' 输出:torch.Size([4, 3]) ''' |
可以看出在非连续的情况下,是不能使用 view 的。
现在我们使用
1 2 3 4 5 | x=x.contiguous() print(x.is_contiguous()) ''' 输出:True ''' |
1 2 3 4 5 6 7 8 9 | x=x.view(1,12) print(x.shape) x=x.reshape(2,6) print(x.shape) ''' 输出:torch.Size([1, 12]) torch.Size([2, 6]) ''' |
可以看出,当tensor变的连续之后,view 就可以正常使用了
二、再来说一说reshape /view 和resize_ 之间的区别
- 它们之间的区别就比较明显,前者在改变形状的时候,总的数据个数不能变,而后者在改变形状的时候是可以只截取一部分数据的。看下面的例子:
1 2 3 4 5 6 7 8 | x = torch.tensor([[1, 2], [3, 4], [5, 6]]) x.resize_(2, 2) print(x) ''' 输出:tensor([[1, 2], [3, 4]]) ''' |
1 2 3 | x = torch.tensor([[1, 2], [3, 4], [5, 6]]) x=x.reshape(2, 2) print(x) |