日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

pytorch中permute()函數用法實例詳解_python

作者:ac不知深 ? 更新時間: 2022-06-25 編程語言

前言

本文只討論二維三維中的permute用法

最近的Attention學習中的一個permute函數讓我不理解

這個光說太抽象

我就結合代碼與圖片解釋一下

首先創建一個三維數組小實例

import torch

x = torch.linspace(1, 30, steps=30).view(3,2,5)     # 設置一個三維數組
print(x)
print(x.size())				# 查看數組的維數

這里為了防止出現維數數值相同的巧合局面(例如三維數組(3,3,3)或者(2,4,4)等)

輸出結果如下圖

一般的把(3,2,5)解釋為3維2行5列這里很容易讓人迷迷糊糊

那么我們按照塊,行,列理解起來會更容易一些

比如(3,2,5),表示3塊 2*5的數組

以下我簡單用3塊3*3圖偷懶舉例

然后堆起來就是我們熟知的三維矩陣

接下來先簡單介紹下permute()函數

permute(dims)
參數dims用矩陣的維數代入,一般默認從0開始。即第0維,第1維等等
也可以理解為,第0塊,第1塊等等。當然矩陣最少是兩維才能使用permute
如是兩維,dims分別為是0和1
可以寫成permute(0,1)這里不做任何變化,維數與之前相同
如果寫成permute(1,0)得到的就是矩陣的轉置
如果三維是permute(0,1,2)
0代表共有幾塊維度:本例中0對應著3塊矩陣
1代表每一塊中有多少行:本例中1對應著每塊有2行
2代表每一塊中有多少列:本例中2對應著每塊有5列
所以是3塊2行5列的三維矩陣
這些0,1,2并沒有任何實際的意義,也不是數值,只是用來標識區別。有點類似于x,y,z來區分三個坐標維度,是人為規定好的
三維情況直接用下面的代碼來給大家講解

三維情況

變化一:不改變任何參數

b = x.permute(0,1,2)            # 不改變維度
print(b)
print(b.size())

發現此時矩陣沒有變化,依然是按照之前的方式排列

變化二:1與2交換

b = x.permute(0,2,1)             # 每一塊的行與列進行交換,即每一塊做轉置行為
print(b)
print(b.size())

兩張圖片可以比較

在不改變每一塊(即)的前提下,對每一塊的行列進行對調(即二維矩陣的轉置)

變化三:0與1交換

b = x.permute(1,0,2)            # 交換塊和行
print(b)
print(b.size())

兩者比較可以看出塊數和每塊的行數發生了變化

即參數0對應的數值3塊變成2塊

參數1對應的2行變成3行

這個變化剛好是0與1 的位置交換,導致參數進行對調

此時變成了2塊 * 3行 * 5列(初始為3塊 * 2行 *5列)

變化四:0與2交換

b = x.permute(2,1,0)            # 交換塊和列
print(b)
print(b.size())

此時參數0對應的3塊經過permute已經變成了5塊

參數2對應的5列已經變成了3列

變化五:0與1交換,1與2交換

b = x.permute(2,0,1)            # 交換塊和行和列
print(b)
print(b.size())

此時參數0對應的3塊變成了5塊

參數1對應的2行變成了3行

參數2對應的5列變成了2列

變化六:0與1交換,0與2交換

b = x.permute(1,2,0)            # 交換塊和行和列
print(b)
print(b.size())

此時參數0對應的3塊變成了2塊

參數1對應的2行變成了5行

參數2對應的5列變成了3列

總結

根據以上舉得二維和三維例子可以知道permute()函數其實是對矩陣的塊行列進行交換

里面的參數并不是具體數值

而是塊行列的代指

寫在最后

沒想隨手寫的一篇居然這么多讀者關注

我又在此篇文章的基礎上,詳細的解釋了維度變化過程

能夠更好的幫助大家理解permute函數的用法

進階文章請戳我

原文鏈接:https://blog.csdn.net/weixin_41377182/article/details/120808310

欄目分類
最近更新