pytorch学习笔记五:pytorch中reshape、view以及resize之间的区别

这里以torch.Tensor下的reshapeviewresize_来举例

一、先来说一说reshapeview之间的区别

相同点:都是可以改变tensor的形状

不同点

  • .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.reshape:

  • view
1
x.view(3,4)

在这里插入图片描述

  • reshape
1
2
3
4
5
x.reshape(3,4)
x.shape
'''
输出:torch.Size([4, 3])
'''

可以看出在非连续的情况下,是不能使用 view 的。

现在我们使用.contiguous()将tensor变成连续的,然后再使用.view.reshape:

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/viewresize_之间的区别
  • 它们之间的区别就比较明显,前者在改变形状的时候,总的数据个数不能变,而后者在改变形状的时候是可以只截取一部分数据的。看下面的例子:
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)

在这里插入图片描述