pytorch当中,我们经常会用到x.view()方法来进行数据维度的变化,但是这个方法具体该如何使用呢?

下面我来记录一下笔记:

一.按照传入数字使数据维度进行转换

首先,我们可以传入我们想要的维度,然后按照传入的数字对数据进行维度变化。比如,x.view()当中可以放入列表或者是单个数字,比如我们有代码先生成一个3*2维度的tensor矩阵,那么我们的代码可以写成x.view(3,2) 也可以在view方法当中放入列表[3,2],最终为x.view([3,2])如下所示:

import torch
b=torch.randn(3,2)#也可以写成b=torch.randn([3,2]),效果是一样的
print(b)

输出如下:

tensor([[-0.0035, -0.7276],
        [ 2.5166, -0.0649],
        [ 2.3062, -1.1144]])

那么我们想要将其维度进行随意变化的话,可以使用view()方法,比如我想将其维度变化成:1*6,则使用方法view(1*6)即可。

代码如下:

import torch
b=torch.randn(3,2)
print(b)
print(b.view(1,6))
print(b.view(6,1))

输出如下:

tensor([[-0.0035, -0.7276],
        [ 2.5166, -0.0649],
        [ 2.3062, -1.1144]])
tensor([[-0.0035, -0.7276,  2.5166, -0.0649,  2.3062, -1.1144]])
tensor([[-0.0035],
        [-0.7276],
        [ 2.5166],
        [-0.0649],
        [ 2.3062],
        [-1.1144]])

这样我们就可以看到tensor的维度确实根据我们所写进行变化了。

二.传入数字-1,自动对维度进行变换

这里讨论第二种方法,也就是在某一个维度,我们可以传入数字-1,自动对维度进行计算并变化:

假设我们有一个数据维度为【3,5,2】的tensor,我们想要将其转化为其中两个维度分别为【3,1】,【5,2】,而剩下的第三个维度自动进行计算,那么我们可以使用-1来代替【3,1,10】当中的10,以及用-1来代替转化后【5,2,3】维度当中的数字3.我们可以发现3*1*10=3*5*2=5*2*3,因此变化后的维度乘积是相等的。

代码如下:

import torch
a=torch.randn(3,5,2)
print(a)
print(a.view(3,1,-1).size())
print(a.view([3,1,-1]).size()) #不管加不加上列表符号,最后reshape的结果是一样的
print(a.view([5,2,-1]).size())

输出如下:

tensor([[[ 1.6498, -0.4354],
         [-1.0042, -0.1582],
         [ 1.2794, -0.1203],
         [ 0.9198,  2.8475],
         [ 0.0065,  1.5481]],

        [[ 0.7220, -1.1230],
         [ 0.2665, -0.6645],
         [-0.6159, -0.3833],
         [-1.4767,  0.8378],
         [-0.3257,  0.2394]],

        [[ 0.3784,  0.4233],
         [-0.5807,  1.2695],
         [ 1.7632,  0.7828],
         [ 1.0076,  0.6205],
         [ 0.9948, -1.2256]]])
torch.Size([3, 1, 10])
torch.Size([3, 1, 10])
torch.Size([5, 2, 3])

输出的维度确实为两个【3,1,10】,以及一个【5,2,3】,说明维度进行了自动的变化。

remark:我们能不能使用view()方法将三维的数据,变成二维的数据呢?

答案显然也是可以的,假设我们依然使用刚才的代码,但是只是将维度变化成二维,代码如下所示:

import torch
a=torch.randn(3,5,2)
print(a.size())
print(a.view([3,-1]).size())

输出为:

torch.Size([3, 5, 2])
torch.Size([3, 10])

因此,我们使用-1数字自动计算出了其余的一个维度,同时将三维的数据压缩为了2维的数据,view方法可谓是非常方便了!