pytorch小記(十七):PyTorch 中的 `expand` 與 `repeat`:詳解廣播機制與復制行為(附詳細示例)

pytorch小記(十七):PyTorch 中的 `expand` 與 `repeat`:詳解廣播機制與復制行為(附詳細示例)

    • 🚀 PyTorch 中的 `expand` 與 `repeat`:詳解廣播機制與復制行為(附詳細示例)
      • 🔍 一、基礎定義
        • 1. `tensor.expand(*sizes)`
        • 2. `tensor.repeat(*sizes)`
      • 📌 二、維度行為詳解
        • 使用 `expand`
        • 使用 `repeat`
      • ?? 三、重點報錯案例解釋
        • 📌 示例 1:`expand(1, 4)` 報錯
        • ? 示例 2:`expand(2, 4)` 正確
      • 🔁 四、repeat 的多種使用場景舉例
      • 🔍 五、輸入維度對 `expand` 和 `repeat` 的影響總結
      • 🎯 六、常見錯誤總結
      • ? 七、維度補齊技巧
      • 🎓 八、結語:如何選擇?
    • 問題
      • 1. PyTorch 自動**廣播一維 tensor**
      • 2. 和二維 `[1, 2, 3]` 效果一樣?
      • 🔎 為什么以前會報錯?
    • 📌 總結規律(適用于新版本 PyTorch)


🚀 PyTorch 中的 expandrepeat:詳解廣播機制與復制行為(附詳細示例)

在使用 PyTorch 構建神經網絡時,經常會遇到不同維度張量需要對齊的問題,expand()repeat() 就是兩種非常常用的方式來處理張量的形狀變化。本博客將詳細解釋兩者的區別、作用、使用規則以及典型的報錯原因,配合實際例子,幫助你深入理解廣播機制。


🔍 一、基礎定義

1. tensor.expand(*sizes)
  • 功能:沿指定維度進行“虛擬復制”,不占用額外內存
  • 要求:只能擴展 原始維度中為1的維度,否則會報錯。
2. tensor.repeat(*sizes)
  • 功能真正復制數據,生成新的內存區域。
  • 不限制是否為1的維度,任意維度都能復制。

📌 二、維度行為詳解

以一個張量為例:

a = torch.tensor([[1], [2]])  # shape: (2, 1)
使用 expand
print(a.expand(2, 3))

結果:

tensor([[1, 1, 1],[2, 2, 2]])
  • 第1維為 1,可以擴展成3列。
  • 數據并沒有真實復制,只是通過 廣播機制 顯示為多列。
使用 repeat
print(a.repeat(1, 3))

結果:

tensor([[1, 1, 1],[2, 2, 2]])
  • 每一行的元素真實地復制了3份,占用了新內存。

?? 三、重點報錯案例解釋

📌 示例 1:expand(1, 4) 報錯
c = torch.tensor([[7], [8]])  # shape: (2, 1)
print(c.expand(1, 4))

錯誤原因

RuntimeError: The expanded size of the tensor (1) must match the existing size (2) at non-singleton dimension 0.

解釋:

  • 原 tensor 的第0維是2,而你想擴展為1。
  • 非1的維度不能進行expand擴展,會觸發報錯。

? 示例 2:expand(2, 4) 正確
c = torch.tensor([[7], [8]])  # shape: (2, 1)
print(c.expand(2, 4))

輸出:

tensor([[7, 7, 7, 7],[8, 8, 8, 8]])
  • 第0維是2,不變 ?
  • 第1維是1,被擴展為4 ?

🔁 四、repeat 的多種使用場景舉例

a = torch.tensor([[1, 2, 3]])  # shape: (1, 3)
print(a.repeat(2, 3))

輸出:

tensor([[1, 2, 3, 1, 2, 3],[1, 2, 3, 1, 2, 3]])

解釋:

  • (2, 3) 的含義是:行重復2次,列重復3次。
  • 數據真實復制!

🔍 五、輸入維度對 expandrepeat 的影響總結

操作輸入維度形狀輸入參數說明
expand必須是顯式維度尺寸必須與原tensor維度數一致,且非1的維度不能變
repeat任意形狀每個維度對應復制幾次
自動廣播可擴展1維為任意數目?expand底層用到
內存行為不復制數據?expand 是 zero-copy
內存行為真正復制?repeat 用得多就要小心內存

🎯 六、常見錯誤總結

錯誤場景示例錯誤原因
expand 維度不對tensor(2, 1).expand(1, 4)非1維度不能擴展
expand 維數不匹配tensor(2, 1).expand(4)參數數目與維度數不一致
repeat 維度數對不上tensor(2, 1).repeat(3)參數不夠,需要補齊

? 七、維度補齊技巧

有時原始張量的維度太少,需要先 .unsqueeze() 添加維度:

x = torch.tensor([1, 2, 3])   # shape: (3,)
x = x.unsqueeze(0)            # shape: (1, 3)
x = x.expand(2, 3)

🎓 八、結語:如何選擇?

  • 如果你只是想“假裝復制”以減少內存開銷 ? expand()
  • 如果你真的需要重復數據去喂模型 ? repeat()
  • 如果你想安全無腦復制 ? repeat() 更通用但代價大
  • 如果你要配合 broadcasting ? expand() 是你的最優選擇

問題

a = torch.tensor([[1, 2, 3]])  # shape: (1, 3)
print(a.shape)
print(a.repeat(6, 4))a = torch.tensor([1, 2, 3])  # shape: (1, 3)
print(a.shape)
print(a.repeat(6, 4))

為什么維度不同但是輸出是一樣的?

1. PyTorch 自動廣播一維 tensor

在新版 PyTorch 中(大約 1.8 起),當你對 一維張量 調用 .repeat(m, n),PyTorch 會自動地把它當作 shape 為 (1, 3),然后再執行 repeat。這相當于隱式地:

a = torch.tensor([1, 2, 3])    # shape: (3,)
a = a.unsqueeze(0)             # shape: (1, 3)
print(a.repeat(6, 4))          # 🔁 repeat(6, 4) 等價于 (6 rows, 12 columns)

2. 和二維 [1, 2, 3] 效果一樣?

是的。你對比的兩個 tensor:

a1 = torch.tensor([[1, 2, 3]])  # shape: (1, 3)
a2 = torch.tensor([1, 2, 3])    # shape: (3,)
print(a1.repeat(6, 4))
print(a2.repeat(6, 4))  # 現在兩者結果完全一致!

輸出都是 shape: (6, 12),值為重復的 [1, 2, 3]

tensor([[1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3],...[1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3]])

🔎 為什么以前會報錯?

在早期版本的 PyTorch 中(<1.8),repeat(6, 4) 要求參數個數和維度完全一致。所以對 a = torch.tensor([1,2,3])(一維)來說,你只能:

a.repeat(6)  # 正確,對一維張量
a.repeat(6, 4)  # 錯誤(舊版本)

📌 總結規律(適用于新版本 PyTorch)

原始 tensorrepeat 維度自動行為結果
[1,2,3] (1維)repeat(6,4)自動 unsqueeze → (1,3)?
[[1,2,3]](2維)repeat(6,4)直接 repeat?
[1,2,3](1維)repeat(6)沿第0維重復?
[[1,2,3]](2維)repeat(6)報錯,維度不匹配?

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

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

相關文章

Databricks: Why did your cluster disappear?

You may found that you created a cluster many days ago, and you didnt delete it, but it is disapear. Why did this happen? Who deleted the cluster? Actually, 30 days after a compute is terminated, it is permanently deleted automaticlly. If your workspac…

C語言【輸出字符串中的大寫字母】

題目 輸出字符串中的大寫字母 思路&#xff08;注意事項&#xff09; 純代碼 #include<stdio.h> #include<string.h>int main(){char str[20], ans[20];fgets(str, sizeof(str), stdin);str[strcspn(str, "\n")] \0;for (int i 0, j 0; i < strl…

基于隊列構建優先級搶占機制的LED燈框架設計與實現

文章目錄 前言一、LED 顯示框架概述1. 框架結構圖2. 基本機制 二、核心結構與接口設計1. 狀態命令結構2. 狀態項結構3. LED框架配置結構4. LED運行控制器 三、LED框架邏輯流程1. 初始化邏輯2. 優先級搶占判斷與處理邏輯3. 執行隊列命令并處理tick4. 隊列為空時的默認狀態回滾 四…

PyQt6實例_A股財報數據維護工具_解說并數據與完整代碼分享

目錄 1 20250403之前的財報數據 2 整個項目代碼 3 工具使用方法 3.1 通過akshare下載 3.2 增量更新 3.3 查看當前數據情況 3.4 從數據庫中下載數據 視頻 1 20250403之前的財報數據 通過網盤分享的文件&#xff1a;財報三表數據20250403之前.7z 鏈接: https://pan.ba…

React 之 Redux 第三十一節 useDispatch() 和 useSelector()使用以及詳細案例

使用 Redux 實現購物車案例 由于 redux 5.0 已經將 createStore 廢棄&#xff0c;我們需要先將 reduxjs/toolkit 安裝一下&#xff1b; yarn add reduxjs/toolkit// 或者 npm install reduxjs/toolkit使用 vite 創建 React 項目時候 配置路徑別名 &#xff1a; // 第一種寫法…

Spring Boot 中集成 Knife4j:解決文件上傳不顯示文件域的問題

Spring Boot 中集成 Knife4j&#xff1a;解決文件上傳不顯示文件域的問題 在使用 Knife4j 為 Spring Boot 項目生成 API 文檔時&#xff0c;開發者可能會遇到文件上傳功能不顯示文件域的問題。本文將詳細介紹如何解決這一問題&#xff0c;并提供完整的解決方案。 Knife4j官網…

OpenCV 圖形API(17)計算輸入矩陣 src 中每個元素的平方根函數sqrt()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 描述 計算數組元素的平方根。 cv::gapi::sqrt 函數計算每個輸入數組元素的平方根。對于多通道數組&#xff0c;每個通道會獨立處理。其精度大約與內置的 …

大學論文書寫規范與格式說明

大學論文書寫規范與格式說明 (適用于人文社科、理工科通用框架) 一、論文整體結構 1. 基本組成部分 封面 包含論文標題、作者姓名、學院/專業、學號、指導教師、提交日期等(按學校模板填寫)。 中英文摘要 中文摘要:300~500字,概述研究背景、方法、結論與創新點,末尾附…

C# 串口通信

1. 導入 using System.IO.Ports;2. 初始化定義 SerialPort sp new SerialPort(); // 設置串口 sp.PortName "COM3"; // 串口 sp.BaudRate 9600; // 波特率 sp.Parity Parity.None; // 校驗位 sp.DataBits 8; // 數據位 sp.StopBits StopBits.One; // 停…

android14 keycode 上報 0 解決辦法

驅動改完后發現上報了keycode=0 04-07 13:02:33.201 2323 2662 D WindowManager: interceptKeyTq keycode=0 interactive=false keyguardActive=true policyFlags=2000000 04-07 13:02:33.458 2323 2662 D WindowManager: interceptKeyTq keycode=0 interactive=false key…

C++day9

思維導圖 牛客練習 練習&#xff1a; 將我們寫的 myList 迭代器里面 operator[] 和 operator 配合異常再寫一遍 #include <iostream> #include <cstring> #include <cstdlib> #include <unistd.h> #include <sstream> #include <vector>…

批量合并多張 jpg/png 圖片為長圖或者 PDF 文件,支持按文件夾合并圖片

我們經常會碰到需要將多張圖片拼成一張圖片的場景&#xff0c;比如將多張圖片拼成九宮格圖片&#xff0c;或者將多張圖片拼成一張長圖。還有可能會碰到需要將多張圖片合并成一個完整的 PDF 文件來方便我們進行打印或者傳輸等操作。那這些將圖片合并成一張圖片或者一個完整的文檔…

程序化廣告行業(73/89):買賣雙方需求痛點及應對策略深度剖析

程序化廣告行業&#xff08;73/89&#xff09;&#xff1a;買賣雙方需求痛點及應對策略深度剖析 大家好&#xff01;一直以來&#xff0c;我都熱衷于在技術領域探索學習&#xff0c;也深知知識的分享能讓我們共同進步。寫這篇博客的目的&#xff0c;就是希望能和大家一起深入了…

[隨筆] nn.Embedding的前向傳播與反向傳播

nn.Embedding的前向傳播與反向傳播 nn.Embedding的前向計算過程 embedding module 的前向過程其實是一個索引&#xff08;查表&#xff09;的過程 表的形式是一個 matrix&#xff08;embedding.weight, learnable parameters&#xff09; matrix.shape: (v, h) v&#xff1a;…

構建實時、融合的湖倉一體數據分析平臺:基于 Delta Lake 與 Apache Iceberg

1. 執行摘要 挑戰&#xff1a; 傳統數據倉庫在處理現代數據需求時面臨諸多限制&#xff0c;包括高昂的存儲和計算成本、處理海量多樣化數據的能力不足、以及數據從產生到可供分析的端到端延遲過高。同時&#xff0c;雖然數據湖提供了低成本、靈活的存儲&#xff0c;但往往缺乏…

Maven error:Could not transfer artifact

問題描述 當項目從私有倉庫下載依賴時&#xff0c;Maven 報錯&#xff0c;無法從遠程倉庫下載指定的依賴包&#xff0c;錯誤信息如下&#xff1a; Could not transfer artifact com.ding.abcd:zabk-java:pom from/to releases (http://192.1122.101/repory/mavenleases/): 此…

Dify 生成提示詞的 Prompt

Dify 生成提示詞的 Prompt **第1次提示詞****第2次提示詞****第3次提示詞**總結 Dify 生成提示詞是&#xff0c;會和LLM進行3次交互&#xff0c;下面是和LLM進行交互是的Prompt。 以下是每次提示詞的概要、目標總結以及原始Prompt&#xff1a; 第1次提示詞 概要&#xff1a; …

sqli-labs靶場 less4

文章目錄 sqli-labs靶場less 4 聯合注入 sqli-labs靶場 每道題都從以下模板講解&#xff0c;并且每個步驟都有圖片&#xff0c;清晰明了&#xff0c;便于復盤。 sql注入的基本步驟 注入點注入類型 字符型&#xff1a;判斷閉合方式 &#xff08;‘、"、’、“”&#xf…

【什么是動態鏈接?這里的動態是什么意思?鏈接了什么?】

動態鏈接&#xff08;Dynamic Linking&#xff09;詳解 1. 什么是動態鏈接&#xff1f; 動態鏈接是 Java 虛擬機&#xff08;JVM&#xff09;在運行時將字節碼中的符號引用&#xff08;Symbolic Reference&#xff09;轉換為直接引用&#xff08;Direct Reference&#xff09;…

AWS S3深度剖析:云存儲的瑞士軍刀

1. 引言 在當今數據驅動的世界中,高效、可靠、安全的數據存儲解決方案至關重要。Amazon Simple Storage Service (S3)作為AWS生態系統中的核心服務之一,為企業和開發者提供了一個強大而靈活的對象存儲平臺。本文將全面解析S3的核心特性,幫助讀者深入理解如何充分利用這一&q…