torch 高維矩陣乘法分析,一文說透

文章目錄

    • 簡介
    • 向量乘法
    • 二維矩陣乘法
    • 三維矩陣乘法
      • 廣播
    • 高維矩陣乘法
    • 開源

簡介

一提到矩陣乘法,大家對于二維矩陣乘法都很了解,即 A 矩陣的行乘以 B 矩陣的列。
但對于高維矩陣乘法可能就不太清楚,不知道高維矩陣乘法是怎么在計算。

建議使用torch.matmul 做矩陣乘法,其支持向量乘法 和 二維、乃至多維的矩陣乘法。

向量乘法

a1 = torch.tensor([1, 2])
res1 = torch.matmul(a1, a1)
print(res1)
print(res1.shape)

輸出:

tensor(5)
torch.Size([])

torch 也支持使用 @ 完成乘法操作

二維矩陣乘法

a2 = torch.tensor([[1, 2]])
res2 = torch.matmul(a2, a2.transpose(-2, -1))
print(res2)
print(res2.shape)

輸出:

tensor([[5]])
torch.Size([1, 1])

torch.mm@ 也可以做二維矩陣乘法:

  • a2 @ a2.transpose(-2, -1)
  • torch.mm(a2, a2.transpose(-2, -1))

三維矩陣乘法

torch.bmm 支持三維矩陣乘法,不支持更高維度的矩陣乘法

a3 = torch.randn(2, 3, 2)
res3 = torch.bmm(a3,a3.transpose(-1, -2)
)
print(res3)
print(res3.shape)

輸出:

tensor([[[ 4.5979,  0.6648,  2.9231],[ 0.6648,  0.1155,  0.4713],[ 2.9231,  0.4713,  1.9805]],[[ 1.0323,  1.8212, -0.3546],[ 1.8212,  3.5445, -0.3834],[-0.3546, -0.3834,  0.2988]]])
torch.Size([2, 3, 3])

a3 的 shape是(2, 3, 2),a3 底層的兩個維度做轉置之后變成(2, 2, 3),才可以做矩陣乘法。
可以發現第一位的數字都是2。高維矩陣做乘法的時候,除了最后兩個維度,高維矩陣前面的維度兩個矩陣要保持一致。

torch.randn(2, 3, 2) @ torch.randn(3, 2, 3)

在這里插入圖片描述
雖然上述兩個矩陣,在最后兩個維度滿足矩陣運算的條件,但是第一個維度兩個矩陣的值不一樣,所以不能做矩陣乘法。

廣播

但是發現:

t1 = torch.randn(1, 3, 2)
t2 = torch.randn(3, 2, 3)
t1 @ t2

輸出:

tensor([[[-0.6557,  1.0518,  0.3055],[-0.2876, -2.5104, -1.4417],[ 1.4447, -0.1799,  0.4602]],[[ 0.2971,  0.0060, -0.2612],[-0.9089,  1.0824,  0.7131],[ 0.0929, -0.7898, -0.0199]],[[ 0.0027,  1.2031,  0.1543],[-0.5603, -1.8567, -0.1302],[ 0.3978, -0.9356, -0.1977]]])

理論上兩個矩陣的高維度的shape不一樣,就不可以做矩陣乘法。但上述 t1t2可以做矩陣乘法。這是因為 t1 的第一個維度是1,就會自動做廣播。

廣播的效果類似于,把 t1 在第一個維度復制成與t2一樣,第一個維度都變成3。
在下述使用 concat完成復制工作,再做矩陣乘法,發現可以得到上述一樣的結果。

torch.concat((t1, t1, t1)) @ t2

輸出:

tensor([[[-0.6557,  1.0518,  0.3055],[-0.2876, -2.5104, -1.4417],[ 1.4447, -0.1799,  0.4602]],[[ 0.2971,  0.0060, -0.2612],[-0.9089,  1.0824,  0.7131],[ 0.0929, -0.7898, -0.0199]],[[ 0.0027,  1.2031,  0.1543],[-0.5603, -1.8567, -0.1302],[ 0.3978, -0.9356, -0.1977]]])

高維矩陣乘法

矩陣乘法只會在最后兩個維度,用A矩陣的行乘以B矩陣的列。
其他的維度都是對應位置的數據,互相做乘法(類似向量乘法)。

high_matrix1 = torch.randn(2, 3, 4, 5)
high_matrix2 = torch.randn(2, 3, 5, 4)
high_result = high_matrix1 @ high_matrix2

把最后兩個維度看成一個點。更高的維度的矩陣乘法,可想象為兩個矩陣對應位置的點相乘。

比如,shape(2, 3, 4, 5)與shape(2, 3, 5, 4)的矩陣相乘,若把最后兩個維度看成一個點。就可以類比為 (2, 3) 與 (2, 3)的兩個矩陣做向量乘法,就是對應位置的點做乘法。

如下面的運行結果所示。針對兩個矩陣,在高維空間中,選取(1,2)對應的小矩陣數據做矩陣乘法得到的結果。與兩個矩陣乘法的結果對應(1,2)的值是一樣的。

(high_matrix1[1][2] @  high_matrix2[1][2]) == high_result[1][2]

輸出:

tensor([[True, True, True, True],[True, True, True, True],[True, True, True, True],[True, True, True, True]])

開源

https://github.com/JieShenAI/csdn/blob/main/25/06/torch_matmul/run.ipynb

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

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

相關文章

瑞薩RA-T系列芯片馬達類工程TCM加速化設置

本篇介紹在使用RA8-T系列芯片,建立馬達類工程應用時,如何將電流環部分的指令和變量設置到TCM單元,以提高電流環執行速度,從而提高系統整體的運行性能,在伺服和高端工業領域有很高的實用價值。本文以RA8T1為范例&#x…

獲取Unity節點路徑

解決目的: 避免手動拼寫節點路徑的時候,出現路徑錯誤導致獲取不到節點的情況。解決效果: 添加如下腳本之后,將自動復制路徑到剪貼板中,在代碼中通過 ctrlv 粘貼路徑代碼如下: public class CustomMenuItems…

Docker 安裝 Oracle 12C

鏡像 https://docker.aityp.com/image/docker.io/truevoly/oracle-12c:latest docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/truevoly/oracle-12c:latest docker tag swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/truevoly/oracle-12c:latest d…

Linux內核網絡協議注冊與初始化:從proto_register到tcp_v4_init_sock的深度解析

一、協議注冊:proto_register的核心使命 在Linux網絡協議棧中,proto_register是協議初始化的基石,主要完成三項關鍵任務: Slab緩存創建(內存管理核心) prot->slab = kmem_cache_create_usercopy(prot->name, prot->obj_size, ...); if (prot->twsk_prot) pr…

GD32 MCU的真隨機數發生器(TRNG)

GD32 MCU的真隨機數發生器(TRNG) 文章目錄 GD32 MCU的真隨機數發生器(TRNG)一、定義與核心特征二、物理機制:量子與經典隨機性三、生成方法四、應用場景五、與偽隨機數的對比六、局限性?? 七、物理熵源原理?? 八、硬件實現流程(以GD32F450 GD32L233為例)8.1. **初始…

Vulkan學習筆記6—渲染呈現

一、渲染循環核心 while (!glfwWindowShouldClose(window)) {glfwPollEvents();helloTriangleApp.drawFrame(); // 繪制幀} 在 Vulkan 中渲染幀包含一組常見的步驟 等待前一幀完成(vkWaitForFences) 從交換鏈獲取圖像(vkAcquireNextImageKH…

React第六十二節 Router中 createStaticRouter 的使用詳解

前言 createStaticRouter 是 React Router 專為 服務端渲染(SSR) 設計的 API,用于在服務器端處理路由匹配和數據加載。它在構建靜態 HTML 響應時替代了客戶端的 BrowserRouter,確保 SSR 和客戶端 Hydration 的路由狀態一致。 一…

qt 雙緩沖案例對比

雙緩沖 1.雙緩沖原理 單緩沖:在paintEvent中直接繪制到屏幕,繪制過程被用戶看到 雙緩沖:先在redrawBuffer繪制到緩沖區,然后一次性顯示完整結果 代碼結構 單緩沖:所有繪制邏輯在paintEvent中 雙緩沖:繪制…

華為云AI開發平臺ModelArts

華為云ModelArts:重塑AI開發流程的“智能引擎”與“創新加速器”! 在人工智能浪潮席卷全球的2025年,企業擁抱AI的意愿空前高漲,但技術門檻高、流程復雜、資源投入巨大的現實,卻讓許多創新構想止步于實驗室。數據科學家…

ParaGraphX [特殊字符]

https://github.com/stevechampion1/paragraphx 一個基于 JAX 的、為 CPU/GPU 加速而生的超高性能圖算法庫。 ParaGraphX 是一個實驗性的 Python 庫,旨在利用 JAX 的即時編譯 (JIT) 和大規模并行計算能力,為經典的圖算法提供驚人的性能提升。我們的目標…

如何用4 種可靠的方法更換 iPhone(2025 年指南)

Apple 每年都會發布新版本的 iPhone。升級到新 iPhone 是一種令人興奮的體驗,但轉移所有寶貴數據的想法有時會讓人感到畏懼。幸運的是,我們準備了 4 種有效的更換 iPhone 的方法,讓你可以毫不費力地更換到你的新 iPhone。 此外,您…

GitLab 拉取變慢的原因及排查方法

前言:在軟件開發的快節奏世界里,高效協作與快速交付是制勝關鍵。然而,當開發團隊興高采烈地投入工作,卻發現從GitLab拉取代碼的速度慢如蝸牛,那種沮喪感簡直能瞬間澆滅熱情。在分布式開發環境中,這種情況時…

落水人員目標檢測數據集(貓臉碼客第253期)

落水人員目標檢測:科技守護生命之舟 一、背景與意義 隨著人類海洋活動和水上活動的日益頻繁,海上與水域安全事故頻發。每年都會開展大量的海上救援行動,以搜救數以萬計的落難人員。在水上活動區域,如水庫、河道等,溺…

JAVA_強制類型轉換:

類型范圍大的變量,不可以直接賦值給類型變量小的變量 需要進行強制類型轉換: 想要完成類型范圍大的變量傳給類型范圍小的變量需要先創建一個新的變量(類型與方法的形參類型要相同)。將類型范圍大的變量前面加上(轉換類…

打卡第44天:無人機數據集分類

重復以下內容 作業: kaggle找到一個圖像數據集,用cnn網絡進行訓練并且用grad-cam做可視化 進階: 并拆分成多個文件 import os import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader,…

個人網站大更新,還是有個總站比較好

個人網站大更新,還是有個總站比較好 放棄了所有框架,用純htmlcssjs擼了個網站,這回可以想改啥改啥了。 選擇了黑紫作為主色調,暫時看著還算可以。 為什么不用那些框架了 幾個原因: 嘗試用vuepress、vitepress、not…

高精度算法詳解:從原理到加減乘除的完整實現

文章目錄 一、為什么需要高精度算法二、高精度算法的數據結構設計2.1 基礎工具函數2.2 高精度加法實現2.3 高精度減法實現2.4 高精度乘法實現2.5 高精度除法實現 三、完整測試程序四、總結 一、為什么需要高精度算法 在編程中,處理極大數值是常見需求,例…

排序--計數排序

一,引言 計數排序是一種針對整數數據的高效排序算法。其主要流程可分為三個步驟:首先計算整數數據的數值范圍;接著按大小順序統計各數值的出現次數;最后根據統計結果輸出排序后的數據序列。 二,求最值 遍歷現有數據,獲取最大值…

Kubernetes安全機制深度解析(四):動態準入控制和Webhook

#作者:程宏斌 文章目錄 動態準入控制什么是準入 Webhook? 嘗試準入Webhook先決條件編寫一個準入 Webhook 服務器部署準入 Webhook 服務即時配置準入 Webhook對 API 服務器進行身份認證 Webhook 請求與響應Webhook 配置匹配請求-規則匹配請求&#xff1a…

WDK 10.0.19041.685,可在32位win7 sp1系統下搭配vs2019使用,可以編譯出xp驅動。

(14)[驅動開發]配置環境 VS2019 WDK10 寫 xp驅動 (14)[驅動開發]配置環境 VS2019 WDK10 寫 xp驅動_microsoft visual 2019 wdk-CSDN博客文章瀏覽閱讀3k次,點贊8次,收藏17次。本文介紹了如何在VS2019環境下安裝和配置Windows Driver Kit(WDK)&#xff0…