------------恢復內容開始------------
概括:
一. 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(),(內存重新開辟空間,重新復制,重新整理)。
------------恢復內容結束------------