張量數值計算

一.前言

前面我們介紹了一下pytorch還有張量的創建,而本章節我們就來介紹一下張量的計算,類型轉換以及操作,這個是十分重要的,我們的學習目標是:掌握張量基本運算、掌握阿達瑪積、點積運算 掌握PyTorch指定運算設備。

PyTorch 計算的數據都是以張量形式存在, 我們需要掌握張量各種運算. 并且, 我們可以在 CPU 中運算, 也可 以在 GPU 中運算.

二.張量基本運算

基本運算中,包括 add、sub、mul、div、neg 等函數, 以及這些函數的帶下劃線的版本 add、sub、mul、 div、neg_,其中帶下劃線的版本為修改原數據。

import numpy as np
import torchdef test():data = torch.randint(0, 10, [2, 3])print(data)print('-' * 50)# 1. 不修改原數據new_data = data.add(10)  # 等價 new_data = data + 10print(new_data)print('-' * 50)# 2. 直接修改原數據# 注意: 帶下劃線的函數為修改原數據本身data.add_(10)  # 等價 data += 10print(data)# 3. 其他函數print(data.sub(100))print(data.mul(100))print(data.div(100))print(data.neg())if __name__ == '__main__':test()

結果展示,大家對著結果就能理解每個函數的意思了。?

tensor([[3, 2, 4],
[5, 2, 6]])
--------------------------------------------------
tensor([[13, 12, 14],
[15, 12, 16]])
--------------------------------------------------
tensor([[13, 12, 14],
[15, 12, 16]])
tensor([[-87, -88, -86],
[-85, -88, -84]])
tensor([[1300, 1200, 1400],
[1500, 1200, 1600]])
tensor([[0.1300, 0.1200, 0.1400],
[0.1500, 0.1200, 0.1600]])
tensor([[-13, -12, -14],
[-15, -12, -16]])

三.阿達瑪積?

阿達瑪積指的是矩陣對應位置的元素相乘.

import numpy as np
import torchdef test():data1 = torch.tensor([[1, 2], [3, 4]])data2 = torch.tensor([[5, 6], [7, 8]])# 第?種?式data = torch.mul(data1, data2)print(data)print('-' * 50)# 第?種?式data = data1 * data2print(data)print('-' * 50)if __name__ == '__main__':test()

?結果展示:

tensor([[ 5, 12],
[21, 32]])
--------------------------------------------------
tensor([[ 5, 12],
[21, 32]])
--------------------------------------------------

四.點積運算

點積運算要求第?個矩陣 shape: (n, m),第?個矩陣 shape: (m, p), 兩個矩陣點積運算 shape 為: (n, p)。

1. 運算符 @ ?于進?兩個矩陣的點乘運算

2. torch.mm ?于進?兩個矩陣點乘運算, 要求輸?的矩陣為2維

3. torch.bmm ?于批量進?矩陣點乘運算, 要求輸?的矩陣為3維

4. torch.matmul 對進?點乘運算的兩矩陣形狀沒有限定.

????????1. 對于輸?都是?維的張量相當于 mm 運算.

????????2. 對于輸?都是三維的張量相當于 bmm 運算

????????3. 對數輸?的 shape 不同的張量, 對應的最后?個維度必須符合矩陣運算規則

import numpy as np
import torch# 1. 點積運算
def test01():data1 = torch.tensor([[1, 2], [3, 4], [5, 6]])data2 = torch.tensor([[5, 6], [7, 8]])# 第?種?式data = data1 @ data2print(data)print('-' * 50)# 第?種?式data = torch.mm(data1, data2)print(data)print('-' * 50)# 第三種?式data = torch.matmul(data1, data2)print(data)print('-' * 50)# 2. torch.mm 和 torch.matmull 的區別
def test02():# matmul 可以兩個維度可以不同# 第?個張量: (3, 4, 5)# 第?個張量: (5, 4)# torch.mm 不可以相乘,? matmul 則可以相乘print(torch.matmul(torch.randn(3, 4, 5), torch.randn(5, 4)).shape)print(torch.matmul(torch.randn(5, 4), torch.randn(3, 4, 5)).shape)# 3. torch.mm 函數的?法def test03():# 批量點積運算# 第?個維度為 batch_size# 矩陣的?三維要滿?矩陣乘法規則data1 = torch.randn(3, 4, 5)data2 = torch.randn(3, 5, 8)data = torch.bmm(data1, data2)print(data.shape)if __name__ == '__main__':test01()test02()test03()

?結果展示:

tensor([[19, 22],
[43, 50],
[67, 78]])
--------------------------------------------------
tensor([[19, 22],
[43, 50],
[67, 78]])
--------------------------------------------------
tensor([[19, 22],
[43, 50],
[67, 78]])
--------------------------------------------------
torch.Size([3, 4, 4])
torch.Size([3, 5, 5])
torch.Size([3, 4, 8])

五.指定設備運算

PyTorch 默認會將張量創建在 CPU 控制的內存中, 即: 默認的運算設備為 CPU。我們也可以將張量創建在 GPU 上, 能夠利?對于矩陣計算的優勢加快模型訓練。將張量移動到 GPU 上有兩種?法: ???????

????????1. 使? cuda ?法

????????2. 直接在 GPU 上創建張量

????????3. 使? to ?法指定設備??

import torch# 1. 使? cuda ?法
def test01():data = torch.tensor([10, 20, 30])print('存儲設備:', data.device)# 如果安裝的不是 gpu 版本的 PyTorch# 或電腦本身沒有 NVIDIA 卡的計算環境# 下?代碼可能會報錯data = data.cuda()print('存儲設備:', data.device)# 使? cpu 函數將張量移動到 cpu 上data = data.cpu()print('存儲設備:', data.device)# 輸出結果:# 存儲設備: cpu# 存儲設備: cuda:0# 存儲設備: cpu# 2. 直接將張量創建在 GPU 上
def test02():data = torch.tensor([10, 20, 30], device='cuda:0')print('存儲設備:', data.device)# 使? cpu 函數將張量移動到 cpu 上data = data.cpu()print('存儲設備:', data.device)# 輸出結果:# 存儲設備: cuda:0# 存儲設備: cpu# 3. 使? to ?法
def test03():data = torch.tensor([10, 20, 30])print('存儲設備:', data.device)data = data.to('cuda:0')print('存儲設備:', data.device)# 輸出結果:# 存儲設備: cpu# 存儲設備: cuda:0# 4. 存儲在不同設備的張量不能運算def test04():data1 = torch.tensor([10, 20, 30], device='cuda:0')data2 = torch.tensor([10, 20, 30])print(data1.device, data2.device)# RuntimeError: Expected all tensors to be on the same device,# but found at least two devices, cuda:0 and cpu!data = data1 + data2print(data)if __name__ == '__main__':test03()

六.總結

在本?節中,我們主要學習的主要內容如下:

????????1. 張量基本運算函數 add、sub、mul、div、neg 等函數, add、sub、mul、div、neg_ 等 inplace 函數

????????2. 張量的阿達瑪積運算 mul 和運算符 * 的?法

????????3. 點積運算:

????????????????1. 運算符 @ ?于進?兩個矩陣的點乘運算

????????????????2. torch.mm ?于進?兩個矩陣點乘運算, 要求輸?的矩陣為2維

????????????????3. torch.bmm ?于批量進?矩陣點乘運算, 要求輸?的矩陣為3維

????????????????4. torch.matmul 對進?點乘運算的兩矩陣形狀沒有限定.

????????????????????????1. 對于輸?都是?維的張量相當于 mm 運算.

????????????????????????2. 對于輸?都是三維的張量相當于 bmm 運算

????????????????????????3. 對數輸?的 shape 不同的張量, 對應的最后?個維度必須符合矩陣運算規則

????????4. 將變量移動到 GPU 設備的?法,例如: cuda ?法、直接在 GPU 上創建張量、使? to ?法指定設備?

?

?

?

?

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

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

相關文章

部署項目頻繁掉線-----Java 進程在云服務器內存不足被 OOM Killer 頻繁殺死-----如何解決?

一、查詢系統日志grep -i "java" /var/log/messages執行這條命令,檢查系統日志里是否有 Java 進程被 OOM Killer 殺死的記錄。日志中反復出現以下內容:Out of memory: Killed process 3679325 (java) total-vm:2947000kB, anon-rss:406604kB..…

【保姆級教程】基于anji-plus-captcha實現行為驗證碼(滑動拼圖+點選文字),前后端完整代碼奉上!

前言 驗證碼作為Web應用的第一道安全防線,其重要性不言而喻。但你是否還在為以下問題煩惱: 傳統字符驗證碼用戶體驗差,識別率低?驗證碼安全性不足,輕易被爬蟲破解?前后端對接繁瑣,集成效率低&…

HTML-八股

1、DOM和BOM DOM是表示HTML或者XML文檔的標準的對象模型,將文檔中每個組件(元素、屬性等)都作為一個對象,使用JS來操作這個對象,從而動態改變頁面內容,結合等。 DOM是以樹型結構組織文檔內容,樹…

ADI的EV-21569-SOM核心板和主板轉接卡的鏈接說明

ADI提供給客戶很多DSP的核心板,比如EV-21569-SOM,EV-21593-SOM,EV-SC594-SOM等,非常多,但是沒有底板,光一個核心板怎么用呢?于是我就在想,我的21569評估板就有通用底板,能…

基于 Redisson 實現分布式系統下的接口限流

在高并發場景下,接口限流是保障系統穩定性的重要手段。常見的限流算法有漏桶算法、令牌桶算法等,而單機模式的限流方案在分布式集群環境下往往失效。本文將介紹如何利用 Redisson 結合 Redis 實現分布式環境下的接口限流,確保集群中所有節點的…

ubuntu播放rosbag包(可鼠標交互)

1 前言 眾所周知,ubuntu中播放bag包最主要的工具是rviz,然而rviz有一個無法忍受的缺陷就是不支持鼠標回滾,并且顯示的時間的ros時間,不是世界時間,因此在遇到相關bug時不能與對應的世界時間對應。基于以上&#xff0c…

一文理解緩存的本質:分層架構、原理對比與實戰精粹

📖 推薦閱讀:《Yocto項目實戰教程:高效定制嵌入式Linux系統》 🎥 更多學習視頻請關注 B 站:嵌入式Jerry 一文理解緩存的本質:分層架構、原理對比與實戰精粹 “緩存讓系統飛起來”——但每一層緩存有何不同?…

【離線數倉項目】——電商域DIM層開發實戰

摘要本文主要介紹了電商域離線數倉項目中DIM層的開發實戰。首先闡述了DIM層的簡介、作用、設計特征、典型維度分類以及交易支付場景下的表示例和客戶維度表設計。接著介紹了DIM層設計規范,包括表結構設計規范、數據處理規范以及常見要求規范。然后詳細講解了DIM層的…

Unreal Engine 自動設置圖像

void UYtGameSettingSubsystem::RunHardwareBenchmark(int32 WorkScale, float CPUMultiplier, float GPUMultiplier) {UGameUserSettings* UserSettings UGameUserSettings::GetGameUserSettings();if (UserSettings){// 運行基準測試(異步操作,可能需…

使用Spring Boot和PageHelper實現數據分頁

在Spring Boot項目中&#xff0c;利用PageHelper插件可以輕松實現數據分頁功能。以下是具體的實現步驟和代碼示例。添加依賴在項目的pom.xml文件中添加PageHelper和MyBatis的依賴。<dependency><groupId>com.github.pagehelper</groupId><artifactId>p…

【IT-Infra】從ITIL到CMDB,配置管理,資產管理,物理機與設備管理(含Infra系列說明)

【IT-Infra】從ITIL到CMDB&#xff0c;配置管理&#xff0c;資產管理&#xff0c;物理機與設備管理&#xff08;含Infra系列說明&#xff09; 文章目錄序&#xff1a;Infra系列說明1、ITIL 信息技術基礎架構庫&#xff08;起源&#xff09;2、CMDB 配置管理數據庫&#xff08;I…

vue使用printJS實現批量打印及單個打印 避免空白頁

本文介紹了使用print-js庫實現批量打印功能的實現方法。通過安裝print-js依賴后,創建一個batchPrintAction方法,該方法接收選中行數據,生成包含多個標簽頁的HTML字符串。每個標簽頁以表格形式展示6個數據字段,并設置了80mm50mm的標簽尺寸。方法使用PrintJS進行打印,配置了…

C++ 選擇排序、冒泡排序、插入排序

選擇排序&#xff1a;是一種簡單直觀的排序算法&#xff0c;每次均是選擇最小&#xff08;大&#xff09;的元素進行排序。選擇排序算法思想&#xff1a;1 在未排序序列中找到最小&#xff08;大&#xff09;元素&#xff0c;存放到排序序列的起始位置2 再從剩余未排序元素中繼…

Linux入門篇學習——Linux 編寫第一個自己的命令,make 工具和 makefile 文件

目錄 一、Linux 編寫第一個自己的命令 1.命令的概念 2.定義一個自己的命令 二、make 工具和 makefile 文件 1.使用 make 工具 2.makefile文件 一、Linux 編寫第一個自己的命令 1.命令的概念 命令就是可執行程序。 比如說我們輸入 ls -al &#xff0c;ls 就是可執行程序的…

實驗一 接蘋果

主要步驟蘋果樹制作&#xff08;蘋果與籃子的制作同理&#xff09;為蘋果添加標簽相機位置設置與游戲面板長寬比設置&#xff08;16:9&#xff09;蘋果下落設置&#xff08;將蘋果從平拋運動改為垂直下落&#xff09;通過設置物理圖層并更改碰撞矩陣表實現通過PlayerPrefs實現游…

Nginx服務器集群:橫向擴展與集群解決方案

橫向擴展&#xff1a;基礎概念 在深入了解Nginx的橫向擴展細節之前&#xff0c;首先理解橫向擴展的含義及其重要性。橫向擴展是指通過增加服務器數量來分散負載并提升整體性能。這與縱向擴展形成對比&#xff0c;縱向擴展是指在單個服務器上增加更多資源&#xff08;如CPU、內…

缺陷的生命周期(Bug Life Cycle)是什么?

一、缺陷生命周期的定義缺陷生命周期是指一個Bug從被發現到最終關閉的完整流程&#xff0c;反映了缺陷在不同角色&#xff08;測試、開發、產品等&#xff09;間的流轉狀態。它是軟件測試流程的核心管理模型&#xff0c;直接影響團隊協作效率。二、標準缺陷生命周期階段以下是通…

AtCoder Beginner Contest 333(A,B,C,D,E,F)

AtCoder Beginner Contest 333 A 題意 輸出n個n(n<9) 代碼 #include<bits/stdc.h> using namespace std; void solve(){int n;cin>>n;for(int i1;i<n;i)cout<<n; } signed main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int T__1;//cin…

留學真相:凌晨兩點被海關攔下時,我才明白人生沒有退路

> 獨立不是選擇&#xff0c;而是生存的必修課下飛機那一刻&#xff0c;幻想中的“鍍金生活”瞬間崩塌。倫敦海關凌晨兩點的燈光下&#xff0c;你顫抖著翻找學校文件&#xff0c;手機信號格空空如也&#xff1b;大巴誤點后&#xff0c;你拖著兩個32公斤的行李箱站在陰雨中&am…

探索AIGC領域DALL·E 2的圖像生成與人類創意的融合

探索AIGC領域DALLE 2的圖像生成與人類創意的融合關鍵詞&#xff1a;AIGC、DALLE 2、圖像生成、人類創意、創意融合摘要&#xff1a;本文聚焦于AIGC領域中DALLE 2的圖像生成技術與人類創意的融合。首先介紹了相關背景&#xff0c;包括DALLE 2的發展歷程和人類創意在藝術創作中的…