網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
一、dim的定義
TensorFlow對(duì)張量的階、維度、形狀有著明確的定義,而在pytorh中對(duì)其的定義卻模糊不清,僅僅有一個(gè)torch.size()的函數(shù)來查看張量的大小(我理解的這個(gè)大小指的就是TensorFlow對(duì)張量的形狀描述,也和numpy的.shape類似)。
所以,首先要搞清楚如何看一個(gè)張量的形狀。
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))
以上代碼的控制臺(tái)輸出為:
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)建了一個(gè)(2,3,4)大小的張量,那么我們?nèi)斯?yīng)該怎么辨別一個(gè)張量的大小呢?
為了直觀,我把這個(gè)張量的中括號(hào)調(diào)整一個(gè)位置:
[
? ? [
? ? ? ? ?[1., 1., 1., 1.],
? ? ? ? ?[1., 1., 1., 1.],
? ? ? ? ?[1., 1., 1., 1.]
? ? ],
?
? ? [
? ? ? ? ?[1., 1., 1., 1.],
? ? ? ? ?[1., 1., 1., 1.],
? ? ? ? ?[1., 1., 1., 1.]
? ? ]
]
我們可以看到:
- 第一層(最外層)中括號(hào)里面包含了兩個(gè)中括號(hào)(以逗號(hào)進(jìn)行分割),這就是(2,3,4)中的2
- 第二層中括號(hào)里面包含了三個(gè)中括號(hào)(以逗號(hào)進(jìn)行分割),這就是(2,3,4)中的3
- 第三層中括號(hào)里面包含了四個(gè)數(shù)(以逗號(hào)進(jìn)行分割),這就是(2,3,4)中的4
結(jié)論:pytorch中的tensor維度可以通過第一個(gè)數(shù)前面的中括號(hào)數(shù)量來判斷,有幾個(gè)中括號(hào)維度就是多少。拿到一個(gè)維度很高的向量,將最外層的中括號(hào)去掉,數(shù)最外層逗號(hào)的個(gè)數(shù),逗號(hào)個(gè)數(shù)加一就是最高維度的維數(shù),如此循環(huán),直到全部解析完畢。
我們還看到:
z.size(0) = 2,z.size(1) = 3,z.size(2) = 4
第0維度為2,第1維度為3,第2維度為4,即維度的標(biāo)號(hào)是以0開始的
二、dim 的理解
網(wǎng)上很多對(duì)dim的理解,比如,dim=0,表示的是行,函數(shù)的意思就是不要行這一維度,保留列巴拉巴拉之類的,個(gè)人覺得不好理解。
比如下圖博主的理解
那我的理解就是:
控制變量法大家知道嗎??或者消融實(shí)驗(yàn)?就是幾個(gè)方法或者實(shí)驗(yàn)的比較,保持只有一個(gè)因素是可變的,其他都是一致的,就是控制變量法,論文術(shù)語(yǔ)也叫消融實(shí)驗(yàn)。
所以,dim的使用也是這樣,只有dim指定的維度是可變的,其他都是固定不變的。
- dim = 0,列不變(按列-將當(dāng)前列所有行數(shù)據(jù)-計(jì)算),指定的是行,那就是行變,理解成:針對(duì)每一列中,所有行之間的數(shù)據(jù)比較或者求和等操作,是每一行的比較,因?yàn)樾惺强勺兊摹?/li>
- dim = 1,行不變(按行-將當(dāng)前行所有列數(shù)據(jù)-計(jì)算),指定的是列,那就是列變,理解成:針對(duì)每一行中,所有列之間的數(shù)據(jù)比較或者求和等操作,是每一行的比較,因?yàn)樾惺强勺兊摹?/li>
三、舉例
torch.argmax() ?
- ?得到最大值的序號(hào)索引
- dim=0保留列維度,不要行了,保留列的size就可以了
- dim=1保留行維度,不要列了,保留行的size就可以了
a = torch.rand((3,4))
print(a)
b = torch.argmax(a, dim=1) ##行不變,指定列,列之間的比較,對(duì)下面每列數(shù)值進(jìn)行比較,將最大值對(duì)應(yīng)序號(hào)存下,比如下面第一列中第一個(gè)值最大,為0,第二列中第二個(gè)是最大值,為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)該也是三個(gè)值,第一行的時(shí)候,同一列之間比較,最大值是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) #列不變,指定行,行是可變的,對(duì)每一列中的所有行之間的數(shù)值進(jìn)行求和,比如這個(gè)例子中,第一列0+3,第二列1+4,第三列2+5
a.sum(dim=1) #行不變,指定列,列是可變的,對(duì)每一行中的所有列之間的數(shù)值進(jìn)行求和,比如這個(gè)例子中,第一行0+1+2,第二行3+4+5
>>tensor(15.)
>>tensor([3., 5., 7.])
>>tensor([ 3., 12.])
說明:dim=0,指定行,行是可變的,列是不變,所以就是同一列中,每一個(gè)行的比較,所以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é)
原文鏈接:https://jingliu.blog.csdn.net/article/details/114262597
相關(guān)推薦
- 2022-05-10 電商后臺(tái)開發(fā)之商品規(guī)格組合算法
- 2022-04-22 C#基于WinForm實(shí)現(xiàn)串口通訊_C#教程
- 2022-04-09 使用docker-compose一鍵部署開源博客wordpress
- 2022-05-23 Jenkins實(shí)現(xiàn)集群化管理以及流水線項(xiàng)目配置_nginx
- 2022-07-02 golang通過node_exporter監(jiān)控GPU及cpu頻率、溫度的代碼_Golang
- 2022-12-14 React懶加載實(shí)現(xiàn)原理深入分析_React
- 2022-11-25 Python中日期和時(shí)間的用法超強(qiáng)總結(jié)_python
- 2022-09-25 如何查看Redis的host和port
- 最近更新
-
- 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)程分支