網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
前言
本文只討論二維三維中的permute用法
最近的Attention學(xué)習(xí)中的一個(gè)permute函數(shù)讓我不理解
這個(gè)光說太抽象
我就結(jié)合代碼與圖片解釋一下
首先創(chuàng)建一個(gè)三維數(shù)組小實(shí)例
import torch
x = torch.linspace(1, 30, steps=30).view(3,2,5) # 設(shè)置一個(gè)三維數(shù)組
print(x)
print(x.size()) # 查看數(shù)組的維數(shù)
這里為了防止出現(xiàn)維數(shù)數(shù)值相同的巧合局面(例如三維數(shù)組(3,3,3)或者(2,4,4)等)
輸出結(jié)果如下圖
一般的把(3,2,5)解釋為3維2行5列這里很容易讓人迷迷糊糊
那么我們按照塊,行,列理解起來會(huì)更容易一些
比如(3,2,5),表示3塊 2*5的數(shù)組
以下我簡(jiǎn)單用3塊3*3圖偷懶舉例
然后堆起來就是我們熟知的三維矩陣
接下來先簡(jiǎn)單介紹下permute()函數(shù)
permute(dims)
參數(shù)dims用矩陣的維數(shù)代入,一般默認(rèn)從0開始。即第0維,第1維等等
也可以理解為,第0塊,第1塊等等。當(dāng)然矩陣最少是兩維才能使用permute
如是兩維,dims分別為是0和1
可以寫成permute(0,1)這里不做任何變化,維數(shù)與之前相同
如果寫成permute(1,0)得到的就是矩陣的轉(zhuǎn)置
如果三維是permute(0,1,2)
0代表共有幾塊維度:本例中0對(duì)應(yīng)著3塊矩陣
1代表每一塊中有多少行:本例中1對(duì)應(yīng)著每塊有2行
2代表每一塊中有多少列:本例中2對(duì)應(yīng)著每塊有5列
所以是3塊2行5列的三維矩陣
這些0,1,2并沒有任何實(shí)際的意義,也不是數(shù)值,只是用來標(biāo)識(shí)區(qū)別。有點(diǎn)類似于x,y,z來區(qū)分三個(gè)坐標(biāo)維度,是人為規(guī)定好的
三維情況直接用下面的代碼來給大家講解
三維情況
變化一:不改變?nèi)魏螀?shù)
b = x.permute(0,1,2) # 不改變維度
print(b)
print(b.size())
發(fā)現(xiàn)此時(shí)矩陣沒有變化,依然是按照之前的方式排列
變化二:1與2交換
b = x.permute(0,2,1) # 每一塊的行與列進(jìn)行交換,即每一塊做轉(zhuǎn)置行為
print(b)
print(b.size())
兩張圖片可以比較
在不改變每一塊(即)的前提下,對(duì)每一塊的行列進(jìn)行對(duì)調(diào)(即二維矩陣的轉(zhuǎn)置)
變化三:0與1交換
b = x.permute(1,0,2) # 交換塊和行
print(b)
print(b.size())
兩者比較可以看出塊數(shù)和每塊的行數(shù)發(fā)生了變化
即參數(shù)0對(duì)應(yīng)的數(shù)值3塊變成2塊
參數(shù)1對(duì)應(yīng)的2行變成3行
這個(gè)變化剛好是0與1 的位置交換,導(dǎo)致參數(shù)進(jìn)行對(duì)調(diào)
此時(shí)變成了2塊 * 3行 * 5列(初始為3塊 * 2行 *5列)
變化四:0與2交換
b = x.permute(2,1,0) # 交換塊和列
print(b)
print(b.size())
此時(shí)參數(shù)0對(duì)應(yīng)的3塊經(jīng)過permute已經(jīng)變成了5塊
參數(shù)2對(duì)應(yīng)的5列已經(jīng)變成了3列
變化五:0與1交換,1與2交換
b = x.permute(2,0,1) # 交換塊和行和列
print(b)
print(b.size())
此時(shí)參數(shù)0對(duì)應(yīng)的3塊變成了5塊
參數(shù)1對(duì)應(yīng)的2行變成了3行
參數(shù)2對(duì)應(yīng)的5列變成了2列
變化六:0與1交換,0與2交換
b = x.permute(1,2,0) # 交換塊和行和列
print(b)
print(b.size())
此時(shí)參數(shù)0對(duì)應(yīng)的3塊變成了2塊
參數(shù)1對(duì)應(yīng)的2行變成了5行
參數(shù)2對(duì)應(yīng)的5列變成了3列
總結(jié)
根據(jù)以上舉得二維和三維例子可以知道permute()函數(shù)其實(shí)是對(duì)矩陣的塊行列進(jìn)行交換
里面的參數(shù)并不是具體數(shù)值
而是塊行列的代指
寫在最后
沒想隨手寫的一篇居然這么多讀者關(guān)注
我又在此篇文章的基礎(chǔ)上,詳細(xì)的解釋了維度變化過程
能夠更好的幫助大家理解permute函數(shù)的用法
進(jìn)階文章請(qǐng)戳我
原文鏈接:https://blog.csdn.net/weixin_41377182/article/details/120808310
相關(guān)推薦
- 2022-05-08 一篇文章詳細(xì)解釋C++的友元(friend)_C 語(yǔ)言
- 2023-01-09 React應(yīng)用框架Dva數(shù)據(jù)流向原理總結(jié)分析_React
- 2023-01-08 ubuntu1804搭建FTP服務(wù)器的詳細(xì)教程_FTP服務(wù)器
- 2023-07-31 Echarts多個(gè)圖表自適應(yīng)窗口大小
- 2021-12-08 c語(yǔ)言單詞本的新增、刪除、查詢按順序顯示功能_C 語(yǔ)言
- 2022-03-17 .NET?6開發(fā)TodoList應(yīng)用實(shí)現(xiàn)系列背景_實(shí)用技巧
- 2022-08-17 python熱力圖實(shí)現(xiàn)的完整實(shí)例_python
- 2023-01-21 Go語(yǔ)言O(shè)RM框架構(gòu)造查詢條件示例詳解_Golang
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支