Pytorch--tensor.view()

在 PyTorch 中,tensor.view() 是一個常用的方法,用于改變張量(Tensor)的形狀(shape),但不會改變其數據本身。它類似于 NumPy 的 reshape(),但有一些關鍵區別。


1. 基本用法

import torchx = torch.arange(1, 10)  # shape: [9]
print(x)
# tensor([1, 2, 3, 4, 5, 6, 7, 8, 9])# 改變形狀為 (3, 3)
y = x.view(3, 3)  
print(y)
# tensor([[1, 2, 3],
#         [4, 5, 6],
#         [7, 8, 9]])

關鍵點

  • 不改變數據,只是重新排列維度。
  • 新形狀的元素數量必須與原張量一致,否則會報錯:
    x.view(2, 5)  # ? 錯誤!因為 2×5=10,但 x 只有 9 個元素
    

2. 自動推斷維度(-1 的作用)

如果不想手動計算某個維度的大小,可以用 -1,PyTorch 會自動計算:

x = torch.arange(1, 10)  # shape: [9]# 自動計算行數,確保列數是 3
y = x.view(-1, 3)  # shape: [3, 3]
print(y)
# tensor([[1, 2, 3],
#         [4, 5, 6],
#         [7, 8, 9]])# 自動計算列數,確保行數是 3
z = x.view(3, -1)  # shape: [3, 3]
print(z)
# 輸出同上

3. view() vs reshape()

方法是否共享內存是否適用于非連續存儲適用場景
view()? 共享內存(修改會影響原張量)? 僅適用于連續存儲的張量高效改變形狀(推薦優先使用)
reshape()? 可能共享內存(如果可能)? 適用于非連續存儲更通用,但可能額外復制數據

示例對比

x = torch.arange(1, 10)  # 連續存儲# view() 可以正常工作
y = x.view(3, 3)  # 如果張量不連續(如轉置后),view() 會報錯
x_transposed = x.t()  # 轉置后存儲不連續
# z = x_transposed.view(9)  # ? RuntimeError: view size is not compatible with input tensor's size and stride# reshape() 可以處理非連續存儲
z = x_transposed.reshape(9)  # ?

4. 常見用途

(1) 展平張量(Flatten)

x = torch.randn(4, 5)  # shape: [4, 5]
flattened = x.view(-1)  # shape: [20]

(2) 調整 CNN 特征圖維度

# 假設 CNN 輸出是 [batch_size, channels, height, width]
features = torch.randn(32, 64, 7, 7)  # shape: [32, 64, 7, 7]# 展平成 [batch_size, channels * height * width] 用于全連接層
flattened = features.view(32, -1)  # shape: [32, 64*7*7] = [32, 3136]

(3) 交換維度(類似 permute

x = torch.randn(2, 3, 4)  # shape: [2, 3, 4]
y = x.view(2, 4, 3)  # shape: [2, 4, 3](相當于交換最后兩維)

5. 注意事項

  1. view() 只適用于連續存儲的張量,否則會報錯,此時應該用 reshape() 或先 .contiguous()
    x_non_contiguous = x.t()  # 轉置后不連續
    x_contiguous = x_non_contiguous.contiguous()  # 變成連續存儲
    y = x_contiguous.view(...)  # 現在可以用 view()
    
  2. view() 返回的新張量與原張量共享內存,修改其中一個會影響另一個:
    x = torch.arange(1, 10)
    y = x.view(3, 3)
    y[0, 0] = 100  # 修改 y 會影響 x
    print(x)  # tensor([100, 2, 3, 4, 5, 6, 7, 8, 9])
    

總結

操作推薦方法
改變形狀(連續張量)view()
改變形狀(非連續張量)reshape().contiguous().view()
展平張量x.view(-1)torch.flatten(x)
調整 CNN 特征圖維度features.view(batch_size, -1)

view() 是 PyTorch 中高效調整張量形狀的首選方法,但要注意內存共享和連續性限制! 🚀
展平(Flatten)或改變形狀(如 viewreshape)的核心原則是保持張量的總元素個數(numel())不變,只是重新排列這些元素的維度。


1. 元素總數不變原則

無論原始張量是幾維的(1D、2D、3D 或更高維),轉換后的新形狀必須滿足:
原形狀的元素總數 = 新形狀的元素總數 \text{原形狀的元素總數} = \text{新形狀的元素總數} 原形狀的元素總數=新形狀的元素總數
即:
元素總數需滿足:
dim 1 × dim 2 × ? × dim n = new_dim 1 × new_dim 2 × ? × new_dim m \text{dim}_1 \times \text{dim}_2 \times \dots \times \text{dim}_n = \text{new\_dim}_1 \times \text{new\_dim}_2 \times \dots \times \text{new\_dim}_m dim1?×dim2?×?×dimn?=new_dim1?×new_dim2?×?×new_dimm?

示例:
import torchx = torch.arange(24)  # 1D 張量,24 個元素
print(x.numel())      # 輸出:24# 轉換為 2D 張量:4 行 × 6 列(4×6=24)
y = x.view(4, 6)      # 形狀 [4, 6]# 轉換為 3D 張量:2×3×4(2×3×4=24)
z = x.view(2, 3, 4)   # 形狀 [2, 3, 4]

2. 自動推斷維度(-1 的作用)

在指定新形狀時,可以用 -1 代表“自動計算該維度大小”,PyTorch 會根據總元素數和其他已知維度推導出 -1 的值。
規則:
推斷的維度 = 總元素數 已知維度的乘積 \text{推斷的維度} = \frac{\text{總元素數}}{\text{已知維度的乘積}} 推斷的維度=已知維度的乘積總元素數?

示例:
x = torch.arange(24)  # 24 個元素# 自動計算行數,確保列數為 6
y = x.view(-1, 6)     # 形狀 [4, 6](因為 24/6=4)# 自動計算列數,確保行數為 3
z = x.view(3, -1)     # 形狀 [3, 8](因為 24/3=8)
錯誤示例:

如果維度乘積不匹配總元素數,會報錯:

x.view(5, -1)  # ? 報錯!24 無法被 5 整除

3. 展平(Flatten)的本質

展平是將任意維度的張量轉換為一維或二維的形式:

  • 一維展平x.view(-1)x.flatten()
    將所有元素排成一行,形狀變為 [num_elements]
  • 二維展平(保留批處理維度)x.view(batch_size, -1)nn.Flatten()
    保持 batch_size 不變,其余維度合并為第二維,形狀變為 [batch_size, features]
示例:
x = torch.randn(2, 3, 4)  # 形狀 [2, 3, 4],總元素數=24# 一維展平
flatten_1d = x.view(-1)    # 形狀 [24]# 二維展平(保留第0維 batch_size=2)
flatten_2d = x.view(2, -1) # 形狀 [2, 12](因為 3×4=12)

4. 為什么需要手動指定部分維度?

  • 全連接層的輸入要求
    通常需要二維張量 [batch_size, features],因此需明確保留 batch_size,其余維度展平。
  • 避免歧義
    例如,若張量形狀為 [32, 64, 7, 7],想展平成 [32, 3136],需明確第二維是 3136(即 64×7×7),而 -1 讓 PyTorch 自動計算。
代碼對比:
# 明確指定第二維
flatten_explicit = x.view(32, 64*7*7)  # 形狀 [32, 3136]# 用 -1 自動計算
flatten_auto = x.view(32, -1)          # 形狀 [32, 3136](推薦)

5. 關鍵總結

  1. 元素總數不變:形狀變換的本質是重新排列數據,不增刪元素。
  2. -1 的作用:自動計算該維度大小,確保總元素數匹配。
  3. 展平的應用場景
    • 全連接層前必須將多維特征轉換為一維向量(如 CNN 的 [batch, C, H, W][batch, C*H*W])。
    • 數據預處理時調整輸入形狀(如圖像展平為向量)。

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

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

相關文章

【機器學習】——機器學習思考總結

摘要 這篇文章深入探討了機器學習中的數據相關問題,重點分析了神經網絡(DNN)的學習機制,包括層級特征提取、非線性激活函數、反向傳播和梯度下降等關鍵機制。同時,文章還討論了數據集大小的標準、機器學習訓練數據量的…

CoAP Shell 筆記

CoAP Shell 筆記 1. 概述 CoAP (Constrained Application Protocol) 是一種專為物聯網 (IoT) 中資源受限的節點和網絡設計的 RESTful Web 傳輸協議。CoAP Shell 是一個基于命令行的交互式工具,用于與支持 CoAP 的服務器進行交互。 2. 主要功能 協議支持&#xff…

【最新】探索CFD的未來:從OpenFOAM到深度學習,全面解析計算流體力學的頂級資源與前沿技術

計算流體力學(CFD)作為現代工程與科學研究的核心工具,正以前所未有的速度邁向智能化與多物理場耦合的新時代。本文全面梳理了在線學習CFD的頂級資源,涵蓋了從傳統數值模擬到深度學習驅動的物理信息模型的廣泛領域,旨在為研究者、工程師和學生提供一站式參考指南。內容分為…

[leetcode]2492. 兩個城市間路徑的最小分數(并查集 排序后建邊)

題目鏈接 題意 給定一個 n n n個點 m m m條邊的無向圖 每條邊有邊權 求1-n的路徑中最小的邊權是多少 每條路可以重復走 思路 把邊按邊權降序排序 用并查集維護連通性 遍歷每條邊 每次合并邊的起點和終點 如果1和n聯通 并且這條邊在1和n的這個連通塊中 就對ans取min Code…

Windows中IDEA2024.1的安裝和使用

如果你也喜歡,記得一鍵三連啊 一、卸載 二、安裝 三、注冊 1、打開Crack文件,直接雙擊 “安裝.bat”,否則可能安裝會出錯!! 2、選擇【Activation code】(不要關閉該界面繼續后面的步驟)。 …

【C#】構造協議幀通過串口下發

構造一個“協議幀”&#xff0c;打包串口/網絡通信幀頭部結構的核心部分 &#x1f527; 代碼&#xff1a; List<byte> frame new List<byte>();// 1. 固定幀頭 frame.AddRange(BitConverter.GetBytes(0x0130)); // 幀頭 (4B) frame.AddRange(BitConverter…

04_SQL概述及DDL

文章目錄 一、關于SQL1.1、SQL概述1.2、SQL分類 二、數據庫操作2.1、查看數據庫2.2、切換數據庫2.3、查詢當前使用的數據庫2.4、創建數據庫2.5、查看數據庫創建信息2.6、修改數據庫2.7、刪除數據庫 三、表的操作3.1、數據類型3.1.1、數值類型3.1.2、字符串類型3.1.3、日期時間類…

HCIA-數據通信datacom認證

文章目錄 一、數據通信簡介1.1 標準協議1.2 數據傳輸過程 二、通用路由平臺VRP2.1 VRP簡介2.2 命令行基礎 三 、網絡層協議IP3.1 數據封裝3.2 數據包傳輸2.3 IP地址2.4 子網劃分2.5 ICMP 四、IP路由基礎4.1 路由概述4.2 路由表4.3 路由轉發4.4 靜態路由4.5 動態路由4.6 路由高級…

fast_pow(),c語言冪函數

double fast_pow(double a, int n) { double res 1.0; while (n > 0) { if (n & 1) res * a; // 如果當前位是1&#xff0c;累乘 a * a; // 平方 n >> 1; // 右移一位&#xff08;相當于 n / 2&…

OpenBMC:BmcWeb 處理http請求2 查找路由對象

OpenBMC:BmcWeb 處理http請求1 生成Request和AsyncResp對象_bmc web-CSDN博客 當接收到http請求,并且完成解析后,調用了App::handle處理請求 而App::handle又調用了router.handle(req, asyncResp);來處理請求 1.Router::handle void handle(const std::shared_ptr<Requ…

[Mac]利用hexo-theme-fluid美化個人博客

接上文,使用Fluid美化個人博客 文章目錄 一、安裝hexo-theme-fluid安裝依賴指定主題創建「關于頁」效果展示 二、修改個性化配置1. 修改網站設置2.修改文章路徑顯示3.體驗分類和標簽4.左上角博客名稱修改5.修改背景圖片6.修改關于界面 歡迎大家參觀 一、安裝hexo-theme-fluid 參…

深入理解二叉樹、B樹與B+樹:原理、應用與實現

文章目錄 引言一、二叉樹&#xff1a;基礎而強大的結構基本概念特性分析Java實現應用場景 二、B樹&#xff1a;適合外存的多路平衡樹基本概念關鍵特性查詢流程示例Java簡化實現典型應用 三、B樹&#xff1a;數據庫索引的首選核心改進優勢分析范圍查詢示例Java簡化實現實際應用 …

8.4考研408簡單選擇排序與堆排序知識點深度解析

考研408「簡單選擇排序與堆排序」知識點全解析 一、簡單選擇排序 1.1 定義與核心思想 簡單選擇排序(Selection Sort)是一種選擇排序算法,其核心思想是: 每趟選擇:從待排序序列中選擇最小(或最大)的元素,與當前位置的元素交換。逐步構建有序序列:經過 n ? 1 n-1

為什么需要開源成分分析?庫博同源分析工具介紹

在當今的軟件開發世界中&#xff0c;開源組件已經成為不可或缺的一部分。無論是加速開發進程&#xff0c;還是降低開發成本&#xff0c;開源組件都為我們帶來了巨大的便利。然而&#xff0c;隨著開源組件的廣泛使用&#xff0c;安全風險也隨之而來。你是否曾擔心過&#xff0c;…

ros2 humble無法識別頭文件<rclcpp/rclcpp.hpp>

首先在C/C配置中設置路徑&#xff1a; 可以編輯文件.vscode/c_cpp_properties.json ${workspaceFolder}/**/opt/ros/humble/include/**編譯配置 確保配置好了CMakeLists.txt文件。 colcon build --cmake-args -DCMAKE_EXPORT_COMPILE_COMMANDSON這樣會在目錄下生成compile_com…

常用的排序算法及對比

1. 選擇排序&#xff08;Selection Sort&#xff09; 算法思想與理論推導 基本思想&#xff1a; 每次從待排序數組中選擇最小&#xff08;或最大&#xff09;的元素&#xff0c;將它與當前序列的起始位置交換&#xff0c;逐步將整個數組排序。 推導過程&#xff1a; 設數組長…

Linux基礎入門:從零開始掌握Linux命令行操作

&#x1f64b;大家好&#xff01;我是毛毛張! &#x1f308;個人首頁&#xff1a; 神馬都會億點點的毛毛張 &#x1f388;有沒有覺得電影里的黑客&#x1f412;酷斃了&#xff1f;他們只用鍵盤?就能搞定一切。今天&#xff0c;毛毛張要帶你們體驗這種快感&#x1f600;&…

OpenAI發布的《Addendum to GPT-4o System Card: Native image generation》文件的詳盡筆記

Native_Image_Generation_System_Card 文件基本信息 文件名稱&#xff1a;《Addendum to GPT-4o System Card: Native image generation》發布機構&#xff1a;OpenAI發布日期&#xff1a;2025年3月25日主要內容&#xff1a;介紹GPT-4o模型中新增的原生圖像生成功能&#xff…

5.02 WPF的 Combox、ListBox,slider、ProgressBar使用

1. 關于Combox\ListBox使用&#xff1a; 1.1 內容綁定有兩種方法&#xff0c; 優先使用方法1&#xff0c;因為列表變化的時候&#xff0c;Combox會自動顯示新的內容。而方法2并不會實時更新。 方法1&#xff1a;使用DataContext this.comboBox1.DisplayMemberPath "na…

《孟婆湯的SHA-256加密》

點擊下面圖片帶您領略全新的嵌入式學習路線 &#x1f525;爆款熱榜 88萬閱讀 1.6萬收藏 文章目錄 **第一章&#xff1a;黃泉路上的數據風暴****第二章&#xff1a;堿基對的非對稱加密****第三章&#xff1a;RAFT協議暴動事件****第四章&#xff1a;靈魂分叉與硬重放****終章&…