基于PyTorch的permute和reshape/view的區(qū)別介紹
二維的情況
先用二維tensor作為例子,方便理解。
permute作用為調(diào)換Tensor的維度,參數(shù)為調(diào)換的維度。例如對于一個二維Tensor來說,調(diào)用tensor.permute(1,0)意為將1軸(列軸)與0軸(行軸)調(diào)換,相當(dāng)于進(jìn)行轉(zhuǎn)置。
In [20]: a
Out[20]:
tensor([[0, 1, 2],
[3, 4, 5]])
In [21]: a.permute(1,0)
Out[21]:
tensor([[0, 3],
[1, 4],
[2, 5]])
如果使用view(3,2)或reshape(3,2),得到的tensor并不是轉(zhuǎn)置的效果,而是相當(dāng)于將原tensor的元素按行取出,然后按行放入到新形狀的tensor中。
In [22]: a.reshape(3,2)
Out[22]:
tensor([[0, 1],
[2, 3],
[4, 5]])
In [23]: a.view(3,2)
Out[23]:
tensor([[0, 1],
[2, 3],
[4, 5]])
高維的情況
一般使用permute的情況都是在更高維的情況下使用,例如對于一個圖像batch,其形狀為[batch, channel, height, width],我們可以使用tensor.permute(0,3,2,1)得到形狀為[batch, width, height, channel]的tensor.
我們構(gòu)造一個模擬的batch用于演示。
In [25]: a=torch.arange(2*3*2*1).reshape(2,3,2,1)
In [26]: a
Out[26]:
tensor([[[[ 0], # 這是第0張“圖片”的第0號通道的2個元素
[ 1]],
[[ 2], # 這是第0張“圖片”的第1號通道的2個元素
[ 3]],
[[ 4], # 這是第0張“圖片”的第2號通道的2個元素
[ 5]]],
[[[ 6],
[ 7]],
[[ 8],
[ 9]],
[[10],
[11]]]])
a的形狀為[2,3,2,1],這個batch有2張“圖片”,每張圖片有3個通道,每個通道為2x1,例如第0張圖片的第0號通道為[[0], [1]].
In [27]: a.permute(0,3,2,1) Out[27]: tensor([[[[ 0, 2, 4], [ 1, 3, 5]]], [[[ 6, 8, 10], [ 7, 9, 11]]]]) In [28]: a.permute(0,3,2,1).shape Out[28]: torch.Size([2, 1, 2, 3])
形狀為[2,3,2,1]的batch執(zhí)行permute(0,3,2,1)交換維度之后,得到的是[2,1,2,3],即[batch, width, height, channel]
可以理解為,對于一個高維的Tensor執(zhí)行permute,我們沒有改變數(shù)據(jù)的相對位置,而只是旋轉(zhuǎn)了一下這個(超)立方體?;蛘咭部梢哉f,改變了我們對這個(超)立方體的“觀察角度”而已。
補(bǔ)充知識:pytorch: torch.Tensor.view ------ reshape
如下所示:
torch.Tensoe.view(python method, in torch.Tensor)
作用: 將輸入的torch.Tensor改變形狀(size)并返回.返回的Tensor與輸入的Tensor必須有相同的元素,相同的元素數(shù)目,但形狀可以不一樣
即,view起到的作用是reshape,view的參數(shù)的是改變后的shape.
示例如下:
>>> x = torch.randn(4, 4) >>> x.size() torch.Size([4, 4]) >>> y = x.view(16) >>> y.size() torch.Size([16]) >>> z = x.view(-1, 8) # the size -1 is inferred from other dimensions >>> z.size() torch.Size([2, 8])
view_as:
tensor_1.view_as(tensor_2):將tensor_1的形狀改成與tensor_2一樣
以上這篇基于PyTorch的permute和reshape/view的區(qū)別介紹就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
python之線程通過信號pyqtSignal刷新ui的方法
今天小編就為大家分享一篇python之線程通過信號pyqtSignal刷新ui的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-01-01
pyqt QGraphicsView 以鼠標(biāo)為中心進(jìn)行縮放功能實現(xiàn)
在PyQt開發(fā)中,實現(xiàn)QGraphicsView的鼠標(biāo)中心縮放功能需要注意初始化以及關(guān)鍵函數(shù)的重定義,遇到不達(dá)預(yù)期的效果時,可能需要重寫所有鼠標(biāo)事件,本文記錄了解決QGraphicsView鼠標(biāo)縮放問題的過程,供開發(fā)者參考2024-10-10
Django中數(shù)據(jù)庫遷移常用的命令小結(jié)
在Django中數(shù)據(jù)庫遷移用于保持?jǐn)?shù)據(jù)庫結(jié)構(gòu)與模型定義同步,這篇文章主要介紹了Django中數(shù)據(jù)庫遷移常用的命令,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-03-03
Python實現(xiàn)標(biāo)記數(shù)組的連通域
這篇文章主要為大家詳細(xì)介紹了如何通過Python實現(xiàn)標(biāo)記數(shù)組的連通域,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Python有一定的幫助,需要的可以參考一下2023-04-04
Python list與NumPy array 區(qū)分詳解
這篇文章主要介紹了Python list與NumPy array 區(qū)分詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11

