【Pytorch】:x.view() view()方法的使用
在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方法可谓是非常方便了!