日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Pytorch教程之torch.mm、torch.bmm、torch.matmul、masked_fill

發布時間:2024/1/8 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Pytorch教程之torch.mm、torch.bmm、torch.matmul、masked_fill 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 1、簡介
  • 2、torch.mm
  • 3、torch.bmm
  • 4、torch.matmul
  • 5、masked_fill

1、簡介

這幾天正在看NLP中的注意力機制,代碼中涉及到了一些關于張量矩陣乘法和填充一些代碼,這里積累一下。主要參考了pytorch2.0的官方文檔。
①torch.mm(input,mat2,*,out=None)
②torch.bmm(input,mat2,*,out=None)
③torch.matmul(input, other, *, out=None)
④Tensor.masked_fill

2、torch.mm

torch.mm語法為:

torch.mm(input, mat2, *, out=None) → Tensor

就是矩陣的乘法。如果輸入input是(n,m),mat2是(m, p),則輸出為(n, p)。
示例:

mat1 = torch.randn(2, 3) mat2 = torch.randn(3, 3) torch.mm(mat1, mat2) -->tensor([[ 0.4851, 0.5037, -0.3633],[-0.0760, -3.6705, 2.4784]])

3、torch.bmm

torch.bmm語法為:

torch.bmm(input, mat2, *, out=None) → Tensor
  • 功能:對存儲在input和mat2矩陣中的批數量的矩陣進行乘積。
  • 要求:input矩陣和mat2必須是三維的張量,且第一個維度即batch維度必須一樣。
  • 舉例:如果input是一個(b, n , m)的張量,mat2是一個(b, m, p)張量,則輸出形狀為(b, n, p)

示例:

input = torch.randn(10, 3, 4) mat2 = torch.randn(10, 4, 5) res = torch.bmm(input, mat2) res.size() -->torch.Size([10, 3, 5])

解讀:實際上刻畫的就是一組矩陣與另一組張量矩陣的乘積,至于一組有多少個矩陣,由input和mat2的第一個輸入維度決定,上述代碼第一個維度為10,就代表著10個形狀為(3, 4)的矩陣與10個形狀為(4, 5)的矩陣分別對應相乘,得到10個形狀為(3, 5)的矩陣。

4、torch.matmul

torch.matmul語法為:

torch.matmul(input, other, *, out=None) → Tensor

該函數刻畫的是兩個張量的乘積,且計算過程與張量的維度密切相關。

如果張量是一維的,輸出結果是點乘,是一個標量。

a = torch.tensor([1,2,4]) b = torch.tensor([2,5,6]) print(torch.matmul(a, b)) print(a.shape) --> tensor(36) -->torch.Size([3])

注意:張量a.shape顯示的是torch.Size([3]),只有一個維度,3是指這個維度中有3個數。
如果兩個張量都是二維的,執行的是矩陣的乘法。

a = torch.tensor([[1,2,4], [6,2,1]]) b = torch.tensor([[2,5],[1,2],[6,8] ]) print(a.shape) print(b.shape) print(torch.matmul(a, b)) -->torch.Size([2, 3]) -->torch.Size([3, 2]) -->tensor([[28, 41],[20, 42]])

由上述示例可知,如果兩個張量均為2維,那么其運算和torch.mm是一樣的。
如果第一個參數input是1維的,第二個參數是二維的,那么在計算時,在第一個參數前增加一個維度1,計算完畢之后再把這個維度去掉。

a = torch.tensor([1,2,4]) b = torch.tensor([[2,5],[1,2],[6,8] ])print(a.shape) print(b.shape) print(torch.matmul(a, b)) -->torch.Size([3]) -->torch.Size([3, 2]) -->tensor([28, 41])

如上所示,a只有一個維度,在進行計算時,變成了(1, 3),則變成了(1, 3)乘以(3, 2),變成(1, 2),最后在去掉1這個維度。
如果第一個參數是2維的,第二個參數是1維的,則返回矩陣-向量乘積。

a = torch.tensor([1,2]) b = torch.tensor([[2,5],[1,2],[6,8] ])print(b.shape) print(a.shape) print(torch.matmul(b, a)) -->torch.Size([3, 2]) -->torch.Size([2]) -->tensor([12, 5, 22])

矩陣乘以張量,就是矩陣中的每一行都與這個張量相乘,最終得到一個一維的,大小為3的結果。
⑤多個維度

  • 如果兩個參數至少都是1維的,且有一個參數的維度N>2,則返回的是一個批矩陣的乘積(即把多出的那個維度看作batch即可,讓每個batch后的矩陣與后面的張量相乘即可)。
  • 如果第一個參數是1維的,則在它的維度前加上1,以便批量矩陣相乘并在之后刪除。如果第二個參數是1維的,則將1追加到其維度,用于批處理矩陣倍數,然后刪除。
  • 舉例:如果input形狀是(j,1,n,n),other的張量形狀是(k,n,n),那么輸出張量的形狀將會是(j,k,n,n)。
  • 如果input形狀是(j,1,n,m),other的張量形狀是(k,m,p),那么輸出張量的形狀將會是(j,k,n,p)。
tensor1 = torch.randn(10, 3, 4, 5) tensor2 = torch.randn(5, 4) torch.matmul(tensor1, tensor2).size() -->torch.Size([10, 3, 4, 4]) tensor1 = torch.randn(10, 3, 4, 5) tensor2 = torch.randn(1, 5, 4) torch.matmul(tensor1, tensor2).size() -->torch.Size([10, 3, 4, 4]) tensor1 = torch.randn(10, 3, 4, 5) tensor2 = torch.randn(1, 1, 5, 4) torch.matmul(tensor1, tensor2).size() -->torch.Size([10, 3, 4, 4])

仔細比較上述三個代碼塊,其最終的結果是一樣的??梢院唵斡洖槿绻麅蓚€維度不一致的話,多出的維度就看作是batch維,相當于在低維度前面增加一個維度。

5、masked_fill

語法為:

Tensor.masked_fill_(mask, value)

參數:

  • mask(BoolTensor):布爾掩碼
  • value(float):用于填充的值。

mask是一個pytorch張量,元素是布爾值,value是要填充的值,填充規則是mask中取值為True的位置對應與需要填充的張量中的位置用value填充。

a = torch.tensor([[0, 8],[ 6, 8],[ 7, 1] ])mask = torch.tensor([[ True, False],[False, False],[False, True] ]) b = a.masked_fill(mask, -1e9) print(b) -->tensor([[-1000000000, 8],[ 6, 8],[ 7, -1000000000]])

總結

以上是生活随笔為你收集整理的Pytorch教程之torch.mm、torch.bmm、torch.matmul、masked_fill的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。