torch.Tensor.view会返回具有相同数据但大小不同的新张量。 返回的张量必须有与原张量相同的数据和相同数量的元素,但可以有不同的大小。一个张量必须是连续contiguous()的才能被查看。类似于Numpy的np.reshape()
pytorch中view的用法
torch.Tensor.view会将原有数据重新分配为一个新的张量,比如我们使用:
x = torch.randn(2, 4)
会输出一个随机张量:
1.5600 -1.6180 -2.0366 2.7115
0.8415 -1.0103 -0.4793 1.5734
[torch.FloatTensor of size 2x4]
然后我们看一下使用view重新构造一个Tensor
y = x.view(4,2)
print y
输出如下
1.5600 -1.6180
-2.0366 2.7115
0.8415 -1.0103
-0.4793 1.5734
[torch.FloatTensor of size 4x2]
从这里我们可以看出来他的作用,既然这样,我们可以将他变成一个三维数组:
z = x.view(2,2,2)
输出
(0 ,.,.) =
1.5600 -1.6180
-2.0366 2.7115
(1 ,.,.) =
0.8415 -1.0103
-0.4793 1.5734
[torch.FloatTensor of size 2x2x2]
注意:我们不能随便定义参数,需要根据自己的数据使用,比如x.view(2,2,1)会返回错误RuntimeError: invalid argument 2: size ‘[2 x 2 x 1]’ is invalid for input of with 8 elements at /Users/soumith/code/builder/wheel/pytorch-src/torch/lib/TH/THStorage.c:41
下面是官方的案例:
x = torch.randn(4, 4)
print x
print x.size()
输出(4L, 4L)
y = x.view(16)
print y.size()
输出(16L,)
z = x.view(-1, 8) # the size -1 is inferred from other dimensions
print z.size()
输出(2L, 8L)
view_as(tensor)的用法
返回被视作与给定的tensor相同大小的原tensor。 等效于:
self.view(tensor.size())
具体用法为:
a = torch.Tensor(2, 4)
b = a.view_as(torch.Tensor(4, 2))
print b
pytorch中view的选择
.resize(): 将tensor的大小调整为指定的大小。如果元素个数比当前的内存大小大,就将底层存储大小调整为与新元素数目一致的大小。如果元素个数比当前内存小,则底层存储不会被改变。原来tensor中被保存下来的元素将保持不变,但新内存将不会被初始化。
.permute(dims):将tensor的维度换位。具体可以自己测试
torch.unsqueeze:返回一个新的张量,对输入的制定位置插入维度
相比之下,如果你想返回相同数量的元素,只是改变数组的形状推荐使用torch.view()