pytorch之维度变化view/reshape;squeeze/unsqueeze;Transpose/permute;Expand/repeat

------------恢复内容开始------------

概括:

 一. view/reshape

     作用几乎一模一样,保证size不变:意思就是各维度相乘之积相等(numel()),且具有物理意义,别瞎变,要不然破坏数据污染数据;

    数据的存储、维度顺序非常重要,需要时刻记住

 

 size没有保持固定住,报错

二。 Squeeze与unsqueeze

   unsqueeze:正索引在之前插入,负索引在之后插入;

 

 

 

 Squeeze:

  1.Dim中size=1的都被挤压,数据本身没变

  2.挤压具体维度的数据,且squeeze(x),x是dim的索引,x既接受正的索引,也接受负的索引。如果这个索引对应的维度是1,则会减少挤压这个维度,如果维度不是1,不会改变。

Expand:不会主动的复制数据,有需要的时候复制数据,否则省略掉复制过程,占用内存小,推荐使用。

repeat:复制内容,1--》4维,实实在在扩展数据

最终效果完全一样。

enpend:  维度(1,32,1,1)-->扩展成(4,32,14,14)必须是Dimention一致(都是四维),都是1--》N(4),不能是3—》N这种;

    如果固定某一维度,不扩展,那就可以写成-1,表示固定这个维度不变。

 Repeate(x,y,z,m),这其中的参数不像expand那样给的维度,它是拷贝的次数。------每个维度要重复的次数;不建议使用repeat函数,因为会把memory改掉,会重现申请内存空间,占用内存压力变大。

 

.t()---转置函数:注意只能使用在2D(二维)数据上,3D,4D不能直接使用

Transpose--维度转换函数:1,3维度转换位置,[b,c,h,w]-->[b,w,h,c],这时可能造成数据不连续了,需要先连续一下(contiguous()),但注意view()会导致维度顺序关系变得模糊,造成数据信息丢失,需要人为跟踪,所以【87】是错的。通过torch.all(torch.eq(a,b))判断a,b是不是每个元素完全一样。

 permute()函数:相当于transpose的加强版,transpose是两两交换,(b,c,h,w)-->(b,w,c,h),只需要将对应的索引放到要转换的位置上就好了,permute(0,3,1,2)——此例与最后的实例不同,就是介绍这个原理。注意如果出现不连续问题,就要使用contiguous(),(内存重新开辟空间,重新复制,重新整理)。

------------恢复内容结束------------

原文地址:https://www.cnblogs.com/kevin-red-heart/p/12774489.html