最近在开始写代码,碰到了view和permute这两个操作,比较容易混淆,在此区分。
注意这是针对pytorch中tensor的操作,和numpy中的array没有任何关系!!!
View的操作在这里可以认为是对维度的改变(扩张或减小),维度扩张的意思就是给原来的数据再多加一维(多加一个中括号),或者就是给原来的数据减去一维(减少一个中括号),下面针对实例进行介绍。
从图中可以看到,我们可以对tensor i
(一共包含3个元素)指定任意的维度(只要维度的乘积综合为tensor i
的总个数即可,例如这里所有的维度乘积之和为3)。
在这里,我们看到-1
的存在,它不是意味着我们索引中的最后一个,而是说让pytroch自动去计算这里应该填入什么值来保证总乘积等于总共的元素个数。(其实是给程序员偷懒的方式!!)
其次,还需要提的是在用view对tensor更改维度以后,其中的值是按照原来tensor中排列的顺序来填充新维度下的tensor内容。
举个例子,
[[1,2,3],[4,5,6]].view(3,2)
会得到
[[1,2],[3,4],[5,6]]
就是按照原来[[1,2,3],[4,5,6]]中数据的顺序,按序取出后然后放入。
总之,这个方法就是能让你把你的tensor变成你想要的维度形式,通过增加维度或者减小维度的方式实现。)
接下来聊聊permute
可能有朋友会说如果有view的操作了,为什么还需要permute来调整维度等等。
其实,permute能做的是view做不到的,
(因为view只能以顺序的方式来摆放元素,但是view可以实现坐标上的对称转换)
且在view进行了维度扩张以后,在有些情况下我们自然而然地将维度之间进行交换位置,实现例如转置这样的操作。
下面用例子来说明
图中第一行其实是定义了一个(1,2,3)维度的tensor,在这里如果我们需要对数据进行维度的变换,例如将原来(1,2,3)维的数据变换为(1,3,2)维的形式。permute在这里做的其实就是一个转置的操作。第0维(也就是上面括号中的1)不去动它,在后面的变换中,将处于(2,1)
[4,5,6]中的4
变换成结果中的(1,2)[1,4]中的4
,来达到转置的效果。可见,也印证了a.permute(0,2,1)
中的2,1
其实是对第3维与第2维进行了交换(也就是我们理解的转置的意思,这里因为是从0开始计数的,所以这里表示维度是0,1,2维)。