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(),(內存重新開辟空間,重新復制,重新整理)。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

------------恢復內容結束------------


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM