PyTorch Tensor 操作入門:轉換、運算、維度變換

目錄

1. Tensor 與 NumPy 數組的轉換

1.1 Tensor 轉換為 NumPy 數組

1.2 NumPy 數組轉換為 Tensor

1.3 獲取單個元素的值

2. Tensor 的基本運算

2.1 生成新 Tensor 的運算

2.2 覆蓋原 Tensor 的運算

2.3 阿達瑪積(逐元素乘法)

2.4 矩陣乘法

3. Tensor 的形狀變換

3.1?view()?方法

3.2?reshape()?方法

4. 維度變換

4.1?transpose()?方法

4.2?permute()?方法

5. 完整代碼示例

6. 總結


在深度學習中,PyTorch 的 Tensor 是核心數據結構,它類似于 NumPy 的數組,但可以在 GPU 上高效運行。除了創建 Tensor,PyTorch 還提供了豐富的操作方法,包括 Tensor 與 NumPy 數組的轉換、基本運算、維度變換等。今天,我們就通過一個簡單的代碼示例,學習這些基本操作。

1. Tensor 與 NumPy 數組的轉換

PyTorch 提供了非常方便的接口,用于在 Tensor 和 NumPy 數組之間進行轉換。這在實際應用中非常有用,因為 NumPy 是 Python 中處理數組的標準庫。

1.1 Tensor 轉換為 NumPy 數組

t1 = torch.tensor([1, 2, 3, 4, 5])
n1 = t1.numpy()
print(n1)
  • t1.numpy():將 Tensor 轉換為 NumPy 數組。注意,這種轉換是淺拷貝,即 NumPy 數組和 Tensor 共享內存。

1.2 NumPy 數組轉換為 Tensor

t2 = torch.tensor(n1)
print(t2)
  • torch.tensor(n1):將 NumPy 數組轉換為 Tensor。這種轉換是深拷貝,即生成一個新的 Tensor,不共享內存。

t3 = torch.from_numpy(n1)
print(t3)
  • torch.from_numpy(n1):將 NumPy 數組轉換為 Tensor。這種轉換是淺拷貝,即 Tensor 和 NumPy 數組共享內存。

1.3 獲取單個元素的值

t4 = torch.tensor([18])
print(t4.item())
  • t4.item():當 Tensor 只有一個元素時,可以使用 item() 獲取該元素的值。

2. Tensor 的基本運算

PyTorch 提供了豐富的運算操作,包括加法、減法、乘法和除法。這些運算可以分為兩類:生成新 Tensor 的操作和覆蓋原 Tensor 的操作。

2.1 生成新 Tensor 的運算

t1 = torch.randint(1, 10, (3, 2))
print(t1.add(1))
  • t1.add(1):對 t1 的每個元素加 1,結果生成一個新的 Tensor。

2.2 覆蓋原 Tensor 的運算

print(t1.add_(1))
  • t1.add_(1):對 t1 的每個元素加 1,結果覆蓋原 Tensor。

2.3 阿達瑪積(逐元素乘法)

t1 = torch.tensor([[1, 2], [3, 4]])
t2 = torch.tensor([[5, 6], [7, 8]])
t3 = t1 * t2
print(t3)
  • t1 * t2:逐元素乘法,即對應位置的元素相乘。

2.4 矩陣乘法

t1 = torch.tensor([[1, 2], [3, 4]])
t2 = torch.tensor([[5, 6], [7, 8]])
t3 = torch.matmul(t1, t2)
print(t3)
  • torch.matmul(t1, t2):矩陣乘法,符合矩陣乘法的規則。

3. Tensor 的形狀變換

在深度學習中,經常需要對 Tensor 的形狀進行變換,例如在卷積神經網絡中調整輸入數據的維度。PyTorch 提供了 view()reshape() 方法來實現這一點。

3.1?view()?方法

t1 = torch.tensor([[1, 2, 3], [4, 5, 6]])
t2 = t1.view(3, 2)
print(t2)
  • t1.view(3, 2):將 Tensor 的形狀從 (2, 3) 變為 (3, 2)。注意,view() 要求 Tensor 的內存是連續的。

3.2?reshape()?方法

t1 = torch.tensor([[1, 2, 3], [4, 5, 6]])
t3 = t1.reshape(3, 2)
print(t3)
  • t1.reshape(3, 2):與 view() 類似,但 reshape() 不要求內存是連續的。

4. 維度變換

在處理多維數據時,經常需要對 Tensor 的維度進行變換,例如在處理圖像數據時交換通道維度。

4.1?transpose()?方法

t1 = torch.randint(1, 20, (3, 4, 5))
t2 = torch.transpose(t1, 0, 1)
print(t2)
  • torch.transpose(t1, 0, 1):交換 Tensor 的第 0 維和第 1 維。

4.2?permute()?方法

t3 = t1.permute(1, 0, 2)
print(t3)
  • t1.permute(1, 0, 2):可以同時交換多個維度,非常靈活。

5. 完整代碼示例

import torchdef test01():t1 = torch.tensor([1,2,3,4,5])# numpy():將tensor轉換為numpy數組,淺拷貝:如果要深拷貝,需要使用copy()# tensor():將numpy數組轉換為tensor,深拷貝# from_numpy():將numpy數組轉換為tensor,淺拷貝n1 = t1.numpy()print(n1)t2 = torch.tensor(n1)print(t2)t3 = torch.from_numpy(n1)print(t3)# item():當tensor只有一個元素時,使用item()獲取該元素的值# t4 = torch.tensor(18)t4 = torch.tensor([18])print(t4)print(t4.item())# t5 = torch.tensor([18],device='cuda')# print(t5.item())def test02():torch.manual_seed(0)# tensor運算# add, sub , mul, div等,計算結果會生成新的tensor# add_, sub_, mul_, div_等,計算結果會覆蓋原來的tensort1 = torch.randint(1 , 10, (3, 2))print(t1)print(t1.add(1))print(t1)print(t1.add_(1))print(t1)'''
阿達碼積:兩個矩陣對應位置相乘,得到一個新的矩陣
Cij = Aij * Bij
運算符號: mul或者*
矩陣運算:(m,p) * (p,n) = (m,n)
'''
def test03():t1 = torch.tensor([1,2],[3,4])t2 = torch.tensor([5,6],[7,8])t3 = t1 * t2print(t3)'''
view():改變tensor的形狀,不改變tensor的數據,內存是連續的
reshape():改變tensor的形狀,不改變tensor的數據,內存不連續
'''def test04():t1 = torch.tensor([1,2,3],[4,5,6])print(t1.is_contiguous())t2 = t1.view(3, 2)print(t2.is_contiguous())t3 = t1.t()print(t3)print(t3.is_contiguous())t4 = t3.view(2, 3)print(t4.is_contiguous())'''
維度變換
transpose():轉置,交換張量的兩個維度, 只能交換兩個維度
permute(input,dims):維度變換,可以交換多個維度
'''
def test05():t1 = torch.randint(1, 20, (3, 4, 5))print(t1)t2 = torch.transpose(t1, 0, 1)print(t2)print(t2.is_contiguous())t3 = t1.permute(t1, (1, 0, 2))print(t3)print(t3.shape)if __name__ == '__main__':# test01()# test02()# test03()# test04()test05()

6. 總結

通過這篇文章,我們學習了 PyTorch 中 Tensor 的基本操作,包括:

  • 如何在 Tensor 和 NumPy 數組之間進行轉換。

  • 如何進行基本的數學運算。

  • 如何改變 Tensor 的形狀。

  • 如何對 Tensor 的維度進行變換。

這些操作是深度學習的基礎,希望這篇文章能幫助你更好地理解和使用 PyTorch!

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

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

相關文章

CompletableFuture使用詳解(Super Detailed)

一、 CompletableFuture介紹 多線程開發一般使用Runnable,Callable,Thread,FutureTask,ThreadPoolExecutor,但也有不近如意的地方 Thread Runnable:執行異步任務,沒有返回結果。 Thread Calla…

開源 Arkts 鴻蒙應用 開發(六)數據持久--文件和首選項存儲

文章的目的為了記錄使用Arkts 進行Harmony app 開發學習的經歷。本職為嵌入式軟件開發,公司安排開發app,臨時學習,完成app的開發。開發流程和要點有些記憶模糊,趕緊記錄,防止忘記。 相關鏈接: 開源 Arkts …

【Bluedroid】藍牙協議棧控制器能力解析與核心功能配置機制(decode_controller_support)

本文圍繞Bluedroid藍牙協議棧中控制器能力解析與核心功能配置的關鍵代碼展開,詳細闡述藍牙協議棧如何通過解析控制器硬件能力,構建 SCO/eSCO、ACL 數據包類型支持掩碼,配置鏈路策略、安全服務、查詢與掃描模式等核心功能。這些機制確保協議棧…

小架構step系列07:查找日志配置文件

1 概述 日志這里采用logback,其為springboot默認的日志工具。其整體已經被springboot封裝得比較好了,扔個配置文件到classpath里就能夠使用。 但在實際使用中,日志配置文件有可能需要進行改動,比如日志的打印級別,平…

一文講清楚React Hooks

文章目錄一文講清楚React Hooks一、什么是 React Hooks?二、常用基礎 Hooks2.1 useState:狀態管理基本用法特點2.2 useEffect:副作用處理基本用法依賴數組說明2.3 useContext:上下文共享基本用法特點三、其他常用 Hooks3.1 useRed…

Apache http 強制 https

1. 修改一下文件配置 sudo nano /etc/apache2/sites-enabled/000-default.conf<VirtualHost *:80>ServerName hongweizhu.comServerAlias www.hongweizhu.comServerAdmin webmasterlocalhostDocumentRoot /var/www/html# 強制重定向到HTTPSRewriteEngine OnRewriteCond …

【讀代碼】GLM-4.1V-Thinking:開源多模態推理模型的創新實踐

一、基本介紹 1.1 項目背景 GLM-4.1V-Thinking是清華大學KEG實驗室推出的新一代開源視覺語言模型,基于GLM-4-9B-0414基礎模型構建。該項目通過引入"思維范式"和強化學習課程采樣(RLCS)技術,顯著提升了模型在復雜任務中的推理能力。其創新點包括: 64k超長上下文…

從代碼生成到智能運維的革命性變革

AI大模型重塑軟件開發&#xff1a;從代碼生成到智能運維的革命性變革 希望對大家有一定的幫助&#xff0c;進行參考 目錄AI大模型重塑軟件開發&#xff1a;從代碼生成到智能運維的革命性變革 希望對大家有一定的幫助&#xff0c;進行參考一、范式轉移&#xff1a;軟件開發進入&…

豆包編寫Java程序小試

今天下載了一本第四版電氣工程師手冊&#xff0c;非常棒的一本書&#xff0c;在給PDF添加目錄的時候&#xff0c;由于目錄有將近60頁&#xff0c;使用老馬開發的PdgCntEditor有點卡頓&#xff0c;不過補充下&#xff0c;老馬這個PdgCntEditor還是非常好的。所以我決定用Java編一…

SpringBoot整合騰訊云新一代行為驗證碼

一 產品介紹 騰訊云官方介紹鏈接 騰訊云新一代行為驗證碼&#xff08;Captcha&#xff09;&#xff0c;基于十道安全防護策略&#xff0c;為網頁、App、小程序開發者打造立體、全面的人機驗證。在保護注冊登錄、活動秒殺、點贊發帖、數據保護等各大場景下業務安全的同時&…

SenseGlove新一代外骨骼力反饋手套Rembrand來襲!亞毫米級手部動捕+指尖觸覺力采集+5Dof主動力反饋多模態

在遠程機器人操作領域&#xff0c;精準的觸覺感知與靈活的動作控制始終是核心需求。SenseGlove 新推出的 Rembrandt 力反饋外骨骼數據手套&#xff0c;以先進技術為支撐&#xff0c;為遠程操控人形機器人手部提供了無縫解決方案&#xff0c;讓操作更精準、更高效。值得一提的是…

Linux 信號機制:操作系統的“緊急電話”系統

想象一下&#xff0c;你正在電腦前專心工作&#xff0c;突然手機響了——這是一個通知&#xff0c;要求你立即處理一件新事情&#xff08;比如接電話&#xff09;。 Linux 系統中的信號&#xff08;Signal&#xff09;?? 機制&#xff0c;本質上就是操作系統內核或進程之間用…

論文略讀:Prefix-Tuning: Optimizing Continuous Prompts for Generation

2021 ACL固定預訓練LM&#xff0c;為LM添加可訓練&#xff0c;任務特定的前綴這樣就可以為不同任務保存不同的前綴這種前綴可以看成連續可微的soft prompt&#xff0c;相比于離散的token&#xff0c;更好優化&#xff0c;效果更好訓練的時候只需要更新prefix部分的參數&#xf…

CSS基礎選擇器、文本屬性、引入方式及Chorme調試工具

CSS基礎 1.1 CSS簡介 CSS 是層疊樣式表 ( Cascading Style Sheets ) 的簡稱. 有時我們也會稱之為 CSS 樣式表或級聯樣式表。 CSS 是也是一種標記語言 CSS 主要用于設置 HTML 頁面中的文本內容&#xff08;字體、大小、對齊方式等&#xff09;、圖片的外形&#xff08;寬高、邊…

RabbitMQ 高級特性之事務

1. 簡介與 MySQL、Redis 一樣&#xff0c;RabbitMQ 也支持事務。事務中的消息&#xff0c;要么全都發送成功&#xff0c;要么全部發送失敗&#xff0c;不會出現一部分成功一部分失敗的情況。2. 使用事務發送消息spring 中使用 RabbitMQ 開啟事務需要兩步&#xff1a;第一步&…

iframe 的同源限制與反爬機制的沖突

一、事件背景A域名接入了動態防護&#xff08;Bot 防護、反爬蟲機制&#xff09;&#xff0c;同時第三方業務B域名通過內嵌iframe的方式調用了A域名下的一個鏈接。二、動態防護介紹&#xff1a;動態防護&#xff08;也稱為 Bot 防護、反爬蟲機制&#xff09;是網站為了防止自動…

Rust 的 Copy 語義:深入淺出指南

在 Rust 中&#xff0c;Copy 是一個關鍵的特性&#xff0c;它定義了類型的復制行為。理解 Copy 語義對于掌握 Rust 的所有權系統和編寫高效代碼至關重要。一、核心概念&#xff1a;Copy vs Move特性Copy 類型非 Copy 類型 (Move)賦值行為按位復制 (bitwise copy)所有權轉移 (ow…

Qt的信號與槽(二)

Qt的信號與槽&#xff08;二&#xff09;1.自定義槽2.通過圖形化界面來生成自定義槽3.自定義信號3.信號和槽帶參數4.參數數量5.connect函數的設計&#x1f31f;hello&#xff0c;各位讀者大大們你們好呀&#x1f31f;&#x1f31f; &#x1f680;&#x1f680;系列專欄&#xf…

Java研學-MongoDB(三)

三 文檔相關 7 文檔統計查詢① 語法&#xff1a; // 精確統計文檔數 慢 準 dahuang> db.xiaohuang.countDocuments({條件}) 4 // 粗略統計文檔數 快 大致準 dahuang> db.xiaohuang.estimatedDocumentCount({條件}) 4② 例子&#xff1a; // 精確統計文檔數 name為奔波兒灞…

TCP協議格式與連接釋放

TCP報文段格式 TCP雖然是面向字節流的&#xff0c;但TCP傳送帶數據單元確是報文段。TCP報文段分為首部和數據段部分&#xff0c;而TCP的全部功能體現在它在首部中各字段的作用。因此&#xff0c;只有弄清TCP首部各字段的作用才能掌握TCP的工作原理。 TCP報文段首部的前20字節是…