Python之維度dim的定義及其理解使用方式
一、dim的定義
TensorFlow對張量的階、維度、形狀有著明確的定義,而在pytorh中對其的定義卻模糊不清,僅僅有一個torch.size()的函數(shù)來查看張量的大小(我理解的這個大小指的就是TensorFlow對張量的形狀描述,也和numpy的.shape類似)。
所以,首先要搞清楚如何看一個張量的形狀。
import torch z = torch.ones(2,3,4) print(z) print(z.size()) print(z.size(0)) print(z.size(1)) print(z.size(2))
以上代碼的控制臺輸出為:
tensor([[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]],
[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]]])
torch.Size([2, 3, 4])
2
3
4
可見,我們成功創(chuàng)建了一個(2,3,4)大小的張量,那么我們?nèi)斯?yīng)該怎么辨別一個張量的大小呢?
為了直觀,我把這個張量的中括號調(diào)整一個位置:
[
[
[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]
],
[
[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]
]
]
我們可以看到:
- 第一層(最外層)中括號里面包含了兩個中括號(以逗號進(jìn)行分割),這就是(2,3,4)中的2
- 第二層中括號里面包含了三個中括號(以逗號進(jìn)行分割),這就是(2,3,4)中的3
- 第三層中括號里面包含了四個數(shù)(以逗號進(jìn)行分割),這就是(2,3,4)中的4
結(jié)論:pytorch中的tensor維度可以通過第一個數(shù)前面的中括號數(shù)量來判斷,有幾個中括號維度就是多少。拿到一個維度很高的向量,將最外層的中括號去掉,數(shù)最外層逗號的個數(shù),逗號個數(shù)加一就是最高維度的維數(shù),如此循環(huán),直到全部解析完畢。
我們還看到:
z.size(0) = 2,z.size(1) = 3,z.size(2) = 4
第0維度為2,第1維度為3,第2維度為4,即維度的標(biāo)號是以0開始的
二、dim 的理解
網(wǎng)上很多對dim的理解,比如,dim=0,表示的是行,函數(shù)的意思就是不要行這一維度,保留列巴拉巴拉之類的,個人覺得不好理解。
比如下圖博主的理解
那我的理解就是:
控制變量法大家知道嗎??或者消融實驗?就是幾個方法或者實驗的比較,保持只有一個因素是可變的,其他都是一致的,就是控制變量法,論文術(shù)語也叫消融實驗。
所以,dim的使用也是這樣,只有dim指定的維度是可變的,其他都是固定不變的。
- dim = 0,列不變(按列-將當(dāng)前列所有行數(shù)據(jù)-計算),指定的是行,那就是行變,理解成:針對每一列中,所有行之間的數(shù)據(jù)比較或者求和等操作,是每一行的比較,因為行是可變的。
- dim = 1,行不變(按行-將當(dāng)前行所有列數(shù)據(jù)-計算),指定的是列,那就是列變,理解成:針對每一行中,所有列之間的數(shù)據(jù)比較或者求和等操作,是每一行的比較,因為行是可變的。
三、舉例
torch.argmax()
- 得到最大值的序號索引
- dim=0保留列維度,不要行了,保留列的size就可以了
- dim=1保留行維度,不要列了,保留行的size就可以了
a = torch.rand((3,4)) print(a) b = torch.argmax(a, dim=1) ##行不變,指定列,列之間的比較,對下面每列數(shù)值進(jìn)行比較,將最大值對應(yīng)序號存下,比如下面第一列中第一個值最大,為0,第二列中第二個是最大值,為1,第三列同 print(b) >>tensor([[0.8338, 0.6953, 0.7558, 0.5803], [0.2105, 0.7638, 0.0912, 0.3341], [0.5585, 0.8019, 0.6590, 0.2268]]) >>tensor([0, 1, 1])
說明:dim=1,指定列,也就是行不變,列之間的比較,所以原來的a有三行,最后argmax()出來的應(yīng)該也是三個值,第一行的時候,同一列之間比較,最大值是0.8338,索引是0,同理,第二行,最大值的索引是1……
sum()
求和
a = t.arange(0,6).view(2,3) a >>tensor([[0, 1, 2], [3, 4, 5]]) a.sum() a.sum(dim=0) #列不變,指定行,行是可變的,對每一列中的所有行之間的數(shù)值進(jìn)行求和,比如這個例子中,第一列0+3,第二列1+4,第三列2+5 a.sum(dim=1) #行不變,指定列,列是可變的,對每一行中的所有列之間的數(shù)值進(jìn)行求和,比如這個例子中,第一行0+1+2,第二行3+4+5 >>tensor(15.) >>tensor([3., 5., 7.]) >>tensor([ 3., 12.])
說明:dim=0,指定行,行是可變的,列是不變,所以就是同一列中,每一個行的比較,所以a.sum(dim = 0),第一列的和就是3,第二列的和就是5,第三列的和就是7.
同理,a.sum(dim=1),指定列,列是可變的,行是不變的,所以就是同一列之間的比較或者操作,所以第一行的求和是3,第二行的求和是12
cumsum()
累加
a = t.arange(0,6).view(2,3) a >>tensor([[0, 1, 2], [3, 4, 5]]) a.cumsum(dim=0) # 指定行,列不變,行變,從第一行到最后一行的累加 >>tensor([[0, 1, 2], [3, 5, 7]]) a.cumsum(dim=1) # 指定列,行不變,列變,從第一列到最后一列的累加 >>tensor([[ 0, 1, 3], [ 3, 7, 12]])
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
python第三方包安裝路徑site-packages下.libs作用詳解
這篇文章主要為大家介紹了python?第三方包安裝路徑?site-packages?下面的以?.libs?結(jié)尾的路徑作用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09Python實現(xiàn)多線程并發(fā)請求測試的腳本
這篇文章主要為大家分享了一個Python實現(xiàn)多線程并發(fā)請求測試的腳本,文中的示例代碼簡潔易懂,具有一定的借鑒價值,需要的小伙伴可以了解一下2023-06-06Python創(chuàng)建高強(qiáng)度密碼生成工具方法實例
這篇文章主要為大家介紹了Python創(chuàng)建高強(qiáng)度密碼生成工具方法實例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12SublimeText 2編譯python出錯的解決方法(The system cannot find the file
這篇文章主要介紹了SublimeText 2編譯python報The system cannot find the file specified錯誤的解決方法,大家參考使用吧2013-11-11python 通過SSHTunnelForwarder隧道連接redis的方法
今天小編就為大家分享一篇python 通過SSHTunnelForwarder隧道連接redis的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-02-02Python3爬蟲之urllib攜帶cookie爬取網(wǎng)頁的方法
今天小編就為大家分享一篇Python3爬蟲之urllib攜帶cookie爬取網(wǎng)頁的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12Python報錯NameError: name ‘secrets‘ is not
在使用Python進(jìn)行安全編程時,我們經(jīng)常需要使用secrets模塊來生成安全的隨機(jī)數(shù),但是卻遇到這個問題,本文主要介紹了Python報錯NameError: name ‘secrets‘ is not defined解決,感興趣的可以了解一下2024-06-06在Python中Dataframe通過print輸出多行時顯示省略號的實例
今天小編就為大家分享一篇在Python中Dataframe通過print輸出多行時顯示省略號的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12