PyTorch張量操作中dim參數的核心原理與應用技巧:

今天在搭建神經網絡模型中重寫forward函數時,對輸出結果在最后一個維度上應用 Softmax 函數,將輸出轉化為概率分布。但對于dim的概念不是很熟悉,經過查閱后整理了一下內容。

PyTorch張量操作精解:深入理解dim參數的維度規則與實踐應用

在PyTorch中,張量(Tensor)的維度操作是深度學習模型實現的基礎。dim參數作為高頻出現的核心概念,其取值邏輯直接影響張量運算的結果。本文將從??維度索引與張量階數的本質區別??出發,系統解析dim在不同場景下的行為規則,并通過代碼示例展示其實際應用。

一、核心概念:dim的本質是維度索引而非張量階數

1.1 維度索引 vs. 張量階數

  • ??維度索引(Dimension Index)??
    指定操作沿哪個軸執行。索引范圍從0(最外層)到ndim-1(最內層)。

    例:二維張量中,dim=0表示行方向(垂直),dim=1表示列方向(水平)。
  • ??張量階數(Tensor Order)??
    描述張量自身的維度數量,如標量(0階)、向量(1階)、矩陣(2階)。

    ??關鍵區別??:dim=0不表示“一維張量”,而是“操作沿最外層軸進行”。

1.2 負索引的映射規則

負索引dim=-k等價于??dim = ndim - k??,其中ndim是總維度數

x = torch.rand(2, 3, 4)  # ndim=3
x.sum(dim=-1)            # 等價于 dim=2(最內層維度)

二、不同維度張量的dim取值規則

2.1 一維張量(向量)

僅含單一維度,索引只能是0-1(二者等價)

v = torch.tensor([1, 2, 3])
v.sum(dim=0)   # 輸出:tensor(6)
v.sum(dim=-1)  # 同上

2.2 二維張量(矩陣)

支持兩個維度索引,正負索引對應關系如下:

操作方向正索引負索引
行方向(垂直)dim=0dim=-2
列方向(水平)dim=1dim=-1

??代碼驗證??:

m = torch.tensor([[1, 2], [3, 4]])
m.sum(dim=0)    # 沿行求和 → tensor([4, 6])
m.sum(dim=-1)   # 沿列求和 → tensor([3, 7])[6](@ref)

2.3 高維張量(如三維立方體)

索引范圍擴展為0ndim-1-ndim-1

cube = torch.arange(24).reshape(2, 3, 4)
cube.sum(dim=1)     # 沿第二個維度壓縮
cube.sum(dim=-2)    # 同上[3,6](@ref)

三、常見操作中dim的行為解析

3.1 歸約操作(Reduction)

sum(),?mean(),?max()等函數通過dim指定壓縮方向:

# 三維張量沿不同軸求和
cube.sum(dim=0)  # 形狀變為(3,4)
cube.sum(dim=1)  # 形狀變為(2,4)[6](@ref)

??保持維度??:使用keepdim=True避免降維(適用于廣播場景)

cube.sum(dim=1, keepdim=True)  # 形狀(2,1,4)

3.2 連接與分割

  • ??拼接(torch.cat)??:dim指定拼接方向
    x = torch.tensor([[1, 2], [3, 4]])
    y = torch.tensor([[5, 6]])
    torch.cat((x, y), dim=0)  # 行方向拼接(新增行)[7](@ref)
  • ??切分(torch.split)??:dim指定切分軸向
    x = torch.arange(10).reshape(5, 2)
    x.split([2, 3], dim=0)  # 分割為2行和3行兩部分[7](@ref)

3.3 高級索引操作

  • ??torch.index_select??:按索引選取數據
    t = torch.tensor([[1, 2], [3, 4], [5, 6]])
    indices = torch.tensor([0, 2])
    t.index_select(dim=0, index=indices)  # 選取第0行和第2行[3,7](@ref)
  • ??torch.gather??:根據索引矩陣收集數據
    # 沿dim=1收集指定索引值
    torch.gather(t, dim=1, index=torch.tensor([[0], [1]]))[5,7](@ref)

四、實際應用場景與避坑指南

4.1 經典場景

  • ??圖像處理??:轉換通道順序(NHWC → NCHW)
    images = images.permute(0, 3, 1, 2)  # dim重排[6,8](@ref)
  • ??注意力機制??:沿特征維度計算Softmax
    attention_scores = torch.softmax(scores, dim=-1)  # 最內層維度[6](@ref)
  • ??損失函數??:交叉熵沿類別維度計算
    loss = F.cross_entropy(output, target, dim=1)  # 類別所在維度[6](@ref)

4.2 常見錯誤與調試

  1. ??維度不匹配??
    x = torch.rand(3, 4)
    y = torch.rand(3, 5)
    torch.cat([x, y], dim=1)  # 正確(列數相同)
    torch.cat([x, y], dim=0)  # 報錯(行數不同)[6](@ref)
  2. ??越界索引??:對二維張量使用dim=2會觸發IndexError。
  3. ??視圖操作陷阱??:view()reshape()需元素總數一致。

五、總結:dim參數核心規則表

??規則描述????示例(二維張量)????高維擴展??
dim=k?操作第k個維度dim=0操作行dim=2操作第三軸
dim=-k?映射為ndim-kdim=-1等價于dim=1(列)dim=-1始終為最內層
一維張量僅支持dim=0/-1v.sum(dim=0)有效不適用
負索引自動轉換m.mean(dim=-2)操作行cube.max(dim=-3)操作首軸

💡 ??高效實踐口訣??:

  1. ??看形狀??:x.shape確定總維數ndim
  2. ??定方向??:根據操作目標選擇dim(正負索引等效)
  3. ??驗維度??:操作后維度數減1(除非keepdim=True

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/83773.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/83773.shtml
英文地址,請注明出處:http://en.pswp.cn/web/83773.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Day 31

1. 規范的文件命名 核心原則: 清晰明確:文件名應準確描述內容(如data_preprocessing.py) 風格統一: 推薦小寫下劃線(Python慣例,如model_training.py) 或使用駝峰式&#xff08…

學習Oracle------認識VARCHAR2

學習Oracle------認識VARCHAR2 VARCHAR2 是 Oracle 數據庫中專門用于存儲可變長度字符串的數據類型,它是 Oracle 對標準 SQL 數據類型 VARCHAR 的增強和替代。以下是全面解析: 核心概念 名字含義: VAR Variable(可變&#xff09…

記錄jackson解析出錯

Jackson 屬性名大小寫 Bug 記錄 問題描述 在前后端交互過程中,前端傳遞的 JSON 字段名為駝峰風格(如 qTitle),后端 Java 實體類字段名也為駝峰(如 private String qTitle;)。 但在反序列化時,…

泰國數碼電商系統定制|3C產品詳情泰語化+售后管理,適配泰國數碼零售

隨著全球數字化的加速,電商行業正在迅速發展,尤其是以泰國為代表的東南亞市場。泰國不僅是一個擁有龐大消費者群體的市場,而且其日益增長的互聯網使用率和手機普及率使得數碼產品的銷售潛力巨大。在這樣的大背景下,針對泰國市場的…

59、定制化原理-SpringBoot定制化組件的幾種方式

59、定制化原理-SpringBoot定制化組件的幾種方式 在Spring Boot中,定制化組件的方式多樣,以下是幾種常見的方法及其原理: #### 修改配置文件 通過修改application.properties或application.yml文件,利用ConfigurationProperties注…

機器學習--分類

陽性(Positive)和陰性(Negative) 陽性(Positive) 正類:通常指的是我們關注的類別或事件;陰性(Negative) 負類: 指的是與陽性相反的類別或事件。…

三星MZQL2960HCJR-00BAL高性能固態硬盤控制器SSD云計算和高端存儲專用 電子元器件解析

MZQL2960HCJR-00BAL 電子元器件解析 1. 基本類型與功能 MZQL2960HCJR-00BAL 是 三星(Samsung) 推出的一款 企業級NVMe SSD主控芯片,屬于 高性能固態硬盤控制器,專為 數據中心、云計算和高端存儲 設計。 關鍵特性: 接…

Blender——建構、粒子、燈光、動畫

Blender是一款開源的三維建模和動畫軟件,可用于創建3D模型、動畫、渲染圖像和視頻,還支持雕刻、紋理繪制、粒子系統等功能。 建構篇: 基本操作: 視角的控制: 控制觀察視角: 鼠標中鍵 平移視圖: Shift鼠標中鍵 縮放視…

節日快樂啊

<section data-role"paragraph" class"_135editor"> <p> <br/> </p> </section> <p> 瑪哈特2025中國國際金屬成形展覽會邀請函 </p><style>* { margin: 0; …

PHP和Node.js哪個更爽?

先說結論&#xff0c;rust完勝。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最開始在蘇寧的時候寫了幾年php&#xff0c;當時覺得php真的是世界上最好的語言&#xff0c;因為當初活在舒適圈里&#xff0c;不愿意跳出來&#xff0c;就好比當初活在…

LeetCode - 387. 字符串中的第一個唯一字符

題目 387. 字符串中的第一個唯一字符 - 力扣&#xff08;LeetCode&#xff09; 思路 用哈希表統計每個字符出現的次數 創建一個 unordered_map<char, int>&#xff0c;遍歷字符串&#xff0c;把每個字符出現的次數存進去。 再遍歷字符串&#xff0c;找到第一個只出現…

python從環境變量和配置文件中獲取配置參數

前言 從環境變量和配置文件中獲取配置參數&#xff0c;相關庫&#xff1a; python-dotenv&#xff1a;第三方庫&#xff0c;需要使用pip安裝configparser&#xff1a;標準庫 代碼 test.ini [mysql] host "192.168.0.10" port 3306 user "root" pas…

HarmonyOS5 運動健康app(一):健康飲食(附代碼)

一、核心數據模型設計 代碼通過兩個接口構建了飲食管理的基礎數據結構&#xff1a; interface footItem {name: string; // 營養名稱&#xff08;蛋白質/碳水/脂肪&#xff09;weight: number; // 重量&#xff08;克&#xff09; }interface DietItem {name: string; // 食物…

MQ選型及RocketMQ架構總覽

一、什么是MQ MQ&#xff08;MessageQueue&#xff09; Message(消息)&#xff1a;消息是在不同進程之間傳遞的數據&#xff0c;這些進程可以在同一臺機器上&#xff0c;也可以在不同的機器上。 Queue&#xff08;隊列&#xff09;&#xff1a;隊列原意是指一種具有FIFO&#…

python與java的區別

java老程序員來學習python了&#xff0c;記錄一下兩種類型語言的區別&#xff1a; Python與Java變量類型對比 python里面定義變量不需要指定變量的數據類型&#xff0c;并且是可以修改成其他類型java里面定義變量要指定變量的數據類型&#xff0c;指定以后不可以修改成其他數據…

固件簽名技術深度解析:HSM模塊如何守護設備安全,CAS系統如何賦能產業升級

引言&#xff1a;數字時代的固件安全危機 在萬物互聯的今天&#xff0c;全球設備固件安全事件頻發&#xff1a;某汽車品牌因固件漏洞導致百萬車輛被遠程控制&#xff0c;某醫療設備廠商因固件篡改引發數據泄露&#xff0c;某工業控制系統因非法固件升級造成生產線癱瘓……這些…

修改Typora快捷鍵

代碼 的默認快捷鍵為&#xff1a; 這對我來說不太友好&#xff0c;太難按了&#xff0c;而且我電腦右邊的Ctrl鍵壞了&#xff0c;這意味著我只能一個左手去按這3個鍵的組合&#xff0c;這更是難上加難了&#xff0c;于是想到改一下快捷鍵&#xff0c;代碼塊 是Ctrl Shift K&…

Bellman-Ford算法(詳解版)

Bellman-Ford算法 Bellman-Ford算法是用來解決,對于有負權的圖的**單源最短路徑**.因為DJ算法不可以解決對于負權的圖,所以使用這個算法來求解.但是依舊不可以有負回路.因為負回路就沒有存在單源最短路徑這一說. BF的另一個重要的用途就是用來檢測**是不是存在負回路** 思路…

《HarmonyOSNext的ForEach數組渲染の核心玩法與避坑指南》

《HarmonyOSNext教學寶典&#xff1a;ForEach數組渲染全攻略與性能優化》 #HarmonyOS開發 #ArkTS實戰 #組件解析 &#x1f3af; ForEach組件完全指南&#xff1a;數組循環渲染核心機制 舉個栗子&#x1f330;&#xff1a; ForEach相當于智能印刷機&#xff0c;將數組元素自動轉…

單片機 - STM32F407 ADC 模式詳解:單次轉換、連續轉換、掃描模式、非掃描模式

STM32F407 ADC 模式詳解&#xff1a;單次轉換、連續轉換、掃描模式、非掃描模式 前言 在 STM32F407 中&#xff0c;ADC&#xff08;模數轉換器&#xff09;模塊常用于采集模擬信號&#xff0c;比如讀取光敏電阻、電壓、電流、溫度傳感器等。STM32 的 ADC 模式較多&#xff0c…