最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PyTorch 中mm和bmm函數(shù)的使用示例詳解

 更新時間:2025年06月18日 16:46:15   作者:點云SLAM  
PyTorch中torch.mm用于二維矩陣乘法,torch.bmm處理批量矩陣乘法(三維張量),均不支持廣播,兩者適用于神經(jīng)網(wǎng)絡(luò)權(quán)重計算、點云變換等場景,區(qū)別在于維度要求和批量處理效率,本文給大家介紹PyTorch 中mm和bmm函數(shù)的使用,感興趣的朋友一起看看吧

torch.mm 是 PyTorch 中用于 二維矩陣乘法(matrix-matrix multiplication) 的函數(shù),等價于數(shù)學(xué)中的 A × B 矩陣乘積。

一、函數(shù)定義

torch.mm(input, mat2) → Tensor

執(zhí)行的是兩個 2D Tensor(矩陣)的標(biāo)準(zhǔn)矩陣乘法。

  • input: 第一個二維張量,形狀為 (n × m)
  • mat2: 第二個二維張量,形狀為 (m × p)
  • 返回:形狀為 (n × p) 的張量

二、使用條件和注意事項

條件說明
僅支持 2D 張量一維或三維以上使用 torch.matmul 或 @ 操作符
維度要匹配即 input.shape[1] == mat2.shape[0]
不支持廣播兩個矩陣維度不匹配會直接報錯
結(jié)果是普通矩陣乘積不是逐元素乘法(Hadamard),即不是 * 或 torch.mul()

三、示例代碼

示例 1:基本矩陣乘法

import torch
A = torch.tensor([[1., 2.], [3., 4.]])   # 2x2
B = torch.tensor([[5., 6.], [7., 8.]])   # 2x2
C = torch.mm(A, B)
print(C)

輸出:

tensor([[19., 22.],
        [43., 50.]])

計算步驟:

C[0][0] = 1*5 + 2*7 = 19
C[0][1] = 1*6 + 2*8 = 22
...

示例 2:不匹配維度導(dǎo)致報錯

A = torch.rand(2, 3)
B = torch.rand(4, 2)
C = torch.mm(A, B)  # ? 會報錯

報錯:

RuntimeError: mat1 and mat2 shapes cannot be multiplied (2x3 and 4x2)

示例 3:推薦寫法(推薦使用 @ 或 matmul)

A = torch.rand(3, 4)
B = torch.rand(4, 5)
C1 = torch.mm(A, B)
C2 = A @ B                # 推薦用法
C3 = torch.matmul(A, B)   # 推薦用法

四、與其他乘法函數(shù)的比較

函數(shù)名支持維度運算類型支持廣播
torch.mm僅限二維矩陣乘法? 不支持
torch.matmul1D, 2D, ND自動判斷點乘 / 矩陣乘? 支持
torch.bmm批量二維乘法3D Tensor batch × batch? 不支持
torch.mul任意維度元素乘(Hadamard)? 支持
* 運算符任意維度元素乘? 支持
@ 運算符ND(推薦用)矩陣乘法(和 matmul 一樣)?

五、典型應(yīng)用場景

  • 神經(jīng)網(wǎng)絡(luò)權(quán)重乘法:output = torch.mm(W, x)
  • 點云 / 圖像變換:x' = torch.mm(R, x) + t
  • 多層感知機(jī)中的矩陣計算
  • 注意力機(jī)制中 QK^T 乘積

六、總結(jié):什么時候用 mm?

使用場景用什么
僅二維矩陣乘法torch.mm
高維或支持廣播乘法torch.matmul / @
批量矩陣乘法 (如 batch_size×3×3)torch.bmm
元素乘torch.mul or *

在 PyTorch 中,torch.bmm 是 批量矩陣乘法(batch matrix multiplication) 的操作,專用于處理三維張量(batch of matrices)。它的主要作用是對一組矩陣成對進(jìn)行乘法,效率遠(yuǎn)高于手動循環(huán)計算。

一、torch.bmm 語法

torch.bmm(input, mat2, *, out=None) → Tensor
  • inputTensor,形狀為 (B, N, M)
  • mat2Tensor,形狀為 (B, M, P)
  • 返回結(jié)果形狀為 (B, N, P)

這表示對 B 對 N×M 和 M×P 的矩陣進(jìn)行成對相乘。

二、示例演示

示例 1:基礎(chǔ)用法

import torch
# 定義兩個 batch 矩陣
A = torch.randn(4, 2, 3)  # shape: (B=4, N=2, M=3)
B = torch.randn(4, 3, 5)  # shape: (B=4, M=3, P=5)
# 批量矩陣乘法
C = torch.bmm(A, B)       # shape: (4, 2, 5)
print(C.shape)  # 輸出: torch.Size([4, 2, 5])

示例 2:手動循環(huán) vs bmm 效率對比

# 慢速手動方式
C_manual = torch.stack([A[i] @ B[i] for i in range(A.size(0))])
# 等效于 bmm
C_bmm = torch.bmm(A, B)
print(torch.allclose(C_manual, C_bmm))  # True

三、注意事項

1. 維度必須是三維張量

  • 否則會報錯:
RuntimeError: batch1 must be a 3D tensor

你可以通過 .unsqueeze() 手動調(diào)整維度:

a = torch.randn(2, 3)
b = torch.randn(3, 4)
# 升維
a_batch = a.unsqueeze(0)  # (1, 2, 3)
b_batch = b.unsqueeze(0)  # (1, 3, 4)
c = torch.bmm(a_batch, b_batch)  # (1, 2, 4)

2. 維度必須滿足矩陣乘法規(guī)則

  • (B, N, M) × (B, M, P) → (B, N, P)
  • 若 M 不一致會報錯:
RuntimeError: Expected size for the second dimension of batch2 tensor to match the first dimension of batch1 tensor

3. bmm 不支持廣播(broadcasting)

  • 必須顯式提供相同的 batch size。
  • 如果只有一個矩陣固定,可以使用 .expand()
A = torch.randn(1, 2, 3)  # 單個矩陣
B = torch.randn(4, 3, 5)  # 4 個矩陣
# 擴(kuò)展 A 以進(jìn)行 batch 乘法
A_expand = A.expand(4, -1, -1)
C = torch.bmm(A_expand, B)  # (4, 2, 5)

四、在實際應(yīng)用中的例子

在點云變換中:批量乘旋轉(zhuǎn)矩陣

# 假設(shè)有 B 個旋轉(zhuǎn)矩陣和點坐標(biāo)
R = torch.randn(B, 3, 3)       # 旋轉(zhuǎn)矩陣
points = torch.randn(B, 3, N)  # 點云
# 先轉(zhuǎn)置點坐標(biāo)為 (B, N, 3)
points_T = points.transpose(1, 2)  # (B, N, 3)
# 用 bmm 做點變換:每組點乘旋轉(zhuǎn)
transformed = torch.bmm(points_T, R.transpose(1, 2))  # (B, N, 3)

五、總結(jié)

特性torch.bmm
操作對象三維張量(batch of matrices)
核心規(guī)則(B, N, M) x (B, M, P) = (B, N, P)
是否支持廣播? 不支持,需要手動 .expand()
與 matmul 區(qū)別matmul 支持更多廣播,bmm 更高效用于純批量矩陣乘法
應(yīng)用場景批量線性變換、點云配準(zhǔn)、神經(jīng)網(wǎng)絡(luò)前向傳播等

到此這篇關(guān)于PyTorch 中mm和bmm函數(shù)的使用詳解的文章就介紹到這了,更多相關(guān)PyTorch mm和bmm函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python flask實現(xiàn)分頁的示例代碼

    python flask實現(xiàn)分頁的示例代碼

    這篇文章主要介紹了python flask實現(xiàn)分頁的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08
  • python如何尋找主串中所有指定子串下標(biāo)

    python如何尋找主串中所有指定子串下標(biāo)

    這篇文章主要介紹了python如何尋找主串中所有指定子串下標(biāo),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • 基于python traceback實現(xiàn)異常的獲取與處理

    基于python traceback實現(xiàn)異常的獲取與處理

    這篇文章主要介紹了基于python traceback實現(xiàn)異常的獲取與處理,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • Python定時執(zhí)行程序問題(schedule)

    Python定時執(zhí)行程序問題(schedule)

    這篇文章主要介紹了Python定時執(zhí)行程序問題(schedule),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • python使用beautifulsoup從愛奇藝網(wǎng)抓取視頻播放

    python使用beautifulsoup從愛奇藝網(wǎng)抓取視頻播放

    這篇文章主要介紹了python使用beautifulsoup從愛奇藝網(wǎng)抓取視頻并播放示例,大家參考使用吧
    2014-01-01
  • 解決python遞歸函數(shù)及遞歸次數(shù)受到限制的問題

    解決python遞歸函數(shù)及遞歸次數(shù)受到限制的問題

    這篇文章主要介紹了解決python遞歸函數(shù)及遞歸次數(shù)受到限制的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Django 序列化的具體使用

    Django 序列化的具體使用

    django rest framework 中的序列化組件,本文主要介紹了Django 序列化的具體使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • python安裝pywifi全過程

    python安裝pywifi全過程

    這篇文章主要介紹了python安裝pywifi全過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Python如何定義有默認(rèn)參數(shù)的函數(shù)

    Python如何定義有默認(rèn)參數(shù)的函數(shù)

    這篇文章主要介紹了Python如何定義有默認(rèn)參數(shù)的函數(shù),幫助大家更好的理解和學(xué)習(xí)Python,感興趣的朋友可以了解下
    2020-08-08
  • PyTorch簡單手寫數(shù)字識別的實現(xiàn)過程

    PyTorch簡單手寫數(shù)字識別的實現(xiàn)過程

    Pytorch是熱門的深度學(xué)習(xí)框架之一,通過經(jīng)典的MNIST數(shù)據(jù)集進(jìn)行快速的pytorch入門,這篇文章主要給大家介紹了關(guān)于PyTorch簡單手寫數(shù)字識別的相關(guān)資料,需要的朋友可以參考下
    2021-11-11

最新評論

贞丰县| 商水县| 衢州市| 新昌县| 华坪县| 南川市| 南召县| 阳信县| 宜都市| 健康| 襄汾县| 桓仁| 西畴县| 颍上县| 盐池县| 浠水县| 土默特右旗| 辉县市| 乐都县| 舞钢市| 西畴县| SHOW| 浠水县| 柞水县| 辽源市| 两当县| 新干县| 神农架林区| 古田县| 沂源县| 白朗县| 思南县| 南投县| 德令哈市| 靖安县| 额尔古纳市| 莲花县| 凤阳县| 津南区| 盐津县| 祥云县|