PyTorch_張量形狀操作

搭建模型時,數據都是基于張量形式的表示,網絡層與層之間很多都是以不同的shape的方式進行表現和運算。

對張量形狀的操作,以便能夠更好處理網絡各層之間的數據連接。


reshape 函數的用法

reshape 函數可以再保證張量數據不變的前提下改變數據的維度,將其轉換成指定的形狀,在神經網絡中經常使用該函數來調節數據的形狀,以適配不同網絡層之間的數據傳遞。

import torch 
import numpy as np def test01():torch.manual_seed(0)data = torch.randint(0, 10, [4, 5])# 查看張量的形狀print(data.shape, data.shape[0], data.shape[1])  # shape屬性可以查看張量的形狀print(data.size(), data.size(0), data.size(1))  # size()方法可以查看張量的形狀# 修改張量的形狀new_data = data.reshape(2, 10) # 兩行十列print(new_data)# 注意:轉換之后的形狀元素個數得等于原來張量的元素個數,不然就報錯。上面創建data就是4*5=20個元素# 使用 -1 代替省略的形狀new_data = data.reshape(-1, 10) # -1表示自動計算行數print(new_data.shape)  # torch.Size([2, 10])print(new_data)new_data = data.reshape(2, -1) # -1表示自動計算列數print(new_data)if __name__ == "__main__":test01() 

transpose 和 permute 函數的使用

transpose 函數可以實現交換張量形狀的指定維度。

例如:一個張量的形狀為 (2, 3, 4) 可以通過 transpose 函數把 3 和 4 進行交換,將張量的形狀變為 (2, 4, 3)。

permute 函數可以一次交換更多的維度。

本質上都是在修改數據的維度。

import torch 
import numpy as np # transpose 函數
def test01():torch.manual_seed(0)data = torch.randint(0, 10, [3, 4, 5])# new_data = data.reshape(4, 3, 5)  # 重新計算維度# print(new_data.shape)# 直接交換兩個維度的值new_data = torch.transpose(data, 0, 1) # 只是將這兩個位置進行交換。0表示第0個維度,1表示第1個維度print(new_data.shape)# 缺點:transpose 一次只能交換兩個維度# 把數據的形狀變成 (4, 5, 3)# 進行第一次交換:(4, 3, 5)# 進行第二次交換:(4, 5, 3)new_data = torch.transpose(data, 0, 1)new_data = torch.transpose(new_data, 1, 2)print(new_data.shape)# permute 函數
def test02():torch.manual_seed(0)data = torch.randint(0, 10, [3, 4, 5])# permute 函數可以一次性交換多個維度new_data = torch.permute(data, [1, 2, 0])print(new_data.shape)if __name__ == "__main__":test02() 

view 和 contigous 函數的用法

view 函數可以用于修改張量的形狀,但是其用法比較局限,只能用于存儲在整塊內存中的張量。

在 PyTorch 中,有些張量是由不同的數據塊組成的,它們并沒有存儲在整塊的內存中,view 函數無法對這樣的張量進行變形處理。
例如:一個張量經過了 transpose 或者 permute 函數的處理之后,就無法使用 view 函數進行形狀操作。

import torch 
import numpy as np # view 函數的使用
def test01():data = torch.tensor([[10, 20, 30], [40, 50, 60]])data = data.view(3, 2)print(data.shape)# 通過 is_contigous 函數來判斷張量是否是連續內存空間 (整塊的內存)print(data.is_contiguous())# view 函數使用注意
def test02():# 當張量經過 transpose 或者 permute 函數之后,內存空間基本不連續# 此時,必須先把空間連續,才能使用 view 函數進行張量形狀操作data = torch.tensor([[10, 20, 30], [40, 50, 60]])data = torch.transpose(data, 0, 1)print(data.is_contiguous())# data = data.view(2, 3)  # 這是報錯的data = data.contiguous().view(2, 3)print(data)if __name__ == "__main__":test02() 

squeeze 和 unsqueeze 函數的用法

squeeze 函數用刪除 shape 為 1 的維度。

unsqueeze 在每個維度添加1,以增加數據的形狀。

import torch 
import numpy as np # squeeze 函數使用
def test01():data = torch.randint(0, 10, [1, 3, 1, 5])print(data.shape)# 維度壓縮,默認去掉所有的1的維度new_data = data.squeeze()print(new_data.shape)# 指定去掉某個1的維度new_data = data.squeeze(2)print(new_data.shape)# unsqueeze 函數使用
def test02():data = torch.randint(0, 10, [3, 5])print(data.shape)new_data = data.unsqueeze(0)print(new_data)if __name__ == "__main__":test01() 

總結

  1. reshape 函數可以在保證張量數據不變的前提下改變數據的維度
  2. transpose 函數可以實現交換張量形狀的指定維度,permute 可以一次交換更多的維度
  3. view 函數也可以用于修改張量的形狀,但是它要求被轉換的張量內存必須連續,所以一般配合 contiguous 函數使用。
  4. squeeze 和 unsqueeze 函數可以用來增加或者減少維度。

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

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

相關文章

大模型實踐:圖文解鎖Ollama在個人筆記本上部署llm

使用在線模型服務時,我們常常需要支付API調用費用,這對于個人開發者或小型組織來說可能是一筆不小的開支。那么,有沒有方法可以在本地免費使用這些強大的模型呢?答案是肯定的——Ollama就是這樣一個工具。 當然如果是比較大的組織…

Python基本語法(lambda表達式)

lambda表達式 lambda的一般形式是在關鍵字lambda后面跟一個或多個參數,之后再緊跟一個 冒號,接下來是一個表達式。lambda是一個表達式,而不是一個語句,它能夠出現 在Python語法不允許def出現的地方。作為表達式,lambd…

【MySQL數據庫】用戶管理

目錄 1,用戶信息 2,創建/刪除/修改用戶 3,數據庫的權限 MySQL數據庫安裝完之后,我們最開始時使用的都是 root 用戶,其它用戶通常無法進行操作。因此,MySQL數據庫需要對用戶進行管理。 1,用戶…

Python的ArcPy基于Excel表格對大量遙感影像批量重分類

本文介紹基于Python中的ArcPy模塊,以Excel表格內的信息,對遙感影像加以重分類的方法。 首先,明確一下本文的需求。現有按照文章ArcPy批量將柵格文件的屬性表導出為Excel表格的方法(https://blog.csdn.net/zhebushibiaoshifu/artic…

LabVIEW 中VI Server導出 VI 配置

該 LabVIEW VI 展示了在 VI Server 中配置和執行 Exported VIs 的過程,實現對服務器端導出 VI 的遠程調用與操作。 ? 具體過程及模塊說明 前期配置:需確保在 LabVIEW 的 “Tools> Options > VI Server > Protocols” 路徑下,啟用 …

論文閱讀:2024 ACM SIGSAC Membership inference attacks against in-context learning

總目錄 大模型安全相關研究:https://blog.csdn.net/WhiffeYF/article/details/142132328 Membership inference attacks against in-context learning https://arxiv.org/pdf/2409.01380 https://www.doubao.com/chat/4030440311895554 速覽 這篇論文主要研究了…

從 Python 基礎到 Django 實戰 —— 數據類型驅動的 Web 開發之旅

主題簡介: 本主題以 Python 基礎數據類型為核心,結合 Django 框架的開發流程,系統講解如何通過掌握數字、字符串、列表、元組、字典等基礎類型,快速構建功能完善的 Web 應用。通過理論與實踐結合,幫助學員從零基礎 Py…

軟考 系統架構設計師系列知識點之雜項集萃(53)

接前一篇文章:軟考 系統架構設計師系列知識點之雜項集萃(52) 第85題 在靜態測試中,主要是對程序代碼進行靜態分析。“數據初始化、賦值或引用過程中的異常”屬于靜態分析中的()。 A. 控制流分析 B. 數據…

Raycaster光線投射

Raycaster光線投射 3D虛擬工廠在線體驗 描述 光線投射Raycaster,用于進行raycasting(光線投射)。 光線投射用于進行鼠標拾取(在三維空間中計算出鼠標移過了什么物體)。 構造器 Raycaster( origin : Vector3, dire…

初識Linux —— git三板斧

版本控制器git 為了我們方便管理不同版本的文件,就有了版本控制器; 所謂的版本控制器,就是能夠了解到一個文件的歷史記錄(修改記錄);簡單來說就是記錄每一次的改動和版本迭代的一個管理系統,同…

用哈希表封裝出unordered_set/_map

前提: ①:本博客是對哈希表(開散列)進行封裝,因為閉散列不優秀(與庫保持一致) ②:哈希表封裝出unordered_set/_map和紅黑樹封裝出ste/map是大同小異的,可以先看下:用紅黑樹封裝出set和map -CSDN博客 ③&…

情緒ABC——AI與思維模型【93】

一、定義 情緒ABC思維模型是一種心理學上的理論,它認為人們的情緒和行為反應(C,Consequence)并非直接由激發事件(A,Activating event)引起,而是由個體對激發事件的認知和評價所產生…

Unity URP RenderTexture優化(二):深度圖優化

目錄 前言: 一、定位深度信息 1.1:k_DepthStencilFormat 1.2:k_DepthBufferBits 1.3:_CameraDepthTexture精度與大小 1.4:_CameraDepthAttachment數量 二、全代碼 前言: 在上一篇文章:Un…

【力扣刷題記錄】hot100錯題本(一)

1. 簡單題 我的答案:時間復雜度過高:O(N^3) class Solution:def twoSum(self, nums: List[int], target: int) -> List[int]:for num in nums:if (target - num) in nums:#多余for i in range(len(nums)):if nums[i] num :for j in range(i1,len(nu…

線程池的線程數配置策略

目錄 1. CPU密集型任務 2. IO密集型任務 3. 混合型任務 1. CPU密集型任務 特點:任務主要消耗CPU資源(如計算、加密、壓縮)。 推薦線程數: 線程數 ≈ 物理核心數 1 / CPU - 1(不知道哪個√) 例如&#…

基于開源鏈動2+1模式AI智能名片S2B2C商城小程序的爆品力構建研究

摘要:在興趣電商生態中,爆品力已成為品牌實現指數級增長的核心競爭力。本文以開源鏈動21模式AI智能名片S2B2C商城小程序為技術載體,結合抖音平臺的內容傳播特性,提出“需求挖掘-技術賦能-內容轉化”三位一體的爆品力構建模型。通過…

photoshop學習筆記2

第一章 第01節-界面的重要性(學習方法) 第02節-文件的打開新建及儲存 第03節-移動工具(圖層概念) 學習目標: 1.了解圖層概念 2.認識工具屬性 3.掌握工具使用 圖層的概念 移動工具 移動工具就是用來移動圖層內容的。是否可以用來移動組…

operator 可以根據需要重載 == 運算符進行比較

要將 vector<AppInfo> 類型的 A 和 B 兩個容器進行比較&#xff0c;并且當 B 中有 A 中沒有的元素時&#xff0c;插入到數據庫中&#xff0c;你可以通過以下步驟實現&#xff1a; 比較元素&#xff1a;遍歷 vector<B>&#xff0c;檢查每個元素是否在 vector<A&…

Three.js在vue中的使用(二)-加載、控制

在 Vue 中使用 Three.js 加載模型、控制視角、添加點擊事件是構建 3D 場景的常見需求。下面是一個完整的示例&#xff0c;演示如何在 Vue 單文件組件中實現以下功能&#xff1a; 使用 GLTFLoader 加載 .glb/.gltf 模型添加 OrbitControls 控制視角&#xff08;旋轉、縮放、平移…