一、主要做用:變換tensor維度
example:python
import torch x = torch.randn(2, 3, 5) print(x.size()) print(x.permute(2, 0, 1).size()) >>>torch.Size([2, 3, 5]) >>>torch.Size([5, 2, 3])
二、介紹一下transpose與permute的異同:
同:都是對tensor維度進行轉置;編程
異:permute函數能夠對任意高維矩陣進行轉置,但沒有torch.permute()這個調用方式機器學習
torch.randn(2,3,4,5).permute(3,2,0,1).shape >>>torch.Size([5, 4, 2, 3])
transpose只能操做2D矩陣的轉置,沒法操做超過2個維度,因此要想實現多個維度的轉置,既能夠用一次性的函數
permute,也能夠屢次使用transpose;學習
torch.randn(2,3,4,5).transpose(3,0).transpose(2,1).transpose(3,2).shape >>>torch.Size([5, 4, 2, 3])
三、permute函數與contiguous、view函數的關聯
contiguous: view只能做用在contiguous的variable上,若是在view以前調用了transpose、permute等,就須要調用spa
contiguous()來返回一個contiguous的copy;.net
也就是說transpose、permute等操做會讓tensor變得在內存上不連續,所以要想view,就得讓tensor先連續;code
解釋以下:有些tensor並非佔用一整塊內存,而是由不一樣的數據塊組成,而tensor的view()操做依賴於內存是整塊的,這時只須要執行contiguous()這個函數,把tensor變成在內存中連續分佈的形式;內存
判斷ternsor是否爲contiguous,能夠調用torch.Tensor.is_contiguous()函數:get
import torch x = torch.ones(10, 10) x.is_contiguous() # True x.transpose(0, 1).is_contiguous() # False x.transpose(0, 1).contiguous().is_contiguous() # True
另:在pytorch的最新版本0.4版本中,增長了torch.reshape(),與 numpy.reshape() 的功能相似,大體至關於 tensor.contiguous().view(),這樣就省去了對tensor作view()變換前,調用contiguous()的麻煩;
三、permute與view函數功能
import torch import numpy as np a=np.array([[[1,2,3],[4,5,6]]]) unpermuted=torch.tensor(a) print(unpermuted.size()) # ——> torch.Size([1, 2, 3]) permuted=unpermuted.permute(2,0,1) print(permuted.size()) # ——> torch.Size([3, 1, 2]) view_test = unpermuted.view(1,3,2) print(view_test.size()) >>>torch.Size([1, 2, 3]) torch.Size([3, 1, 2]) torch.Size([1, 3, 2])
承接Matlab、Python和C++的編程,機器學習、計算機視覺的理論實現及輔導,本科和碩士的都可,鹹魚交易,專業回答請走知乎,詳談請聯繫QQ號757160542,非誠勿擾。
本文同步分享在 博客「於小勇」(CSDN)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。