Pytorch之permute函數

一、主要做用:變換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源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索