中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Broadcast廣播機制在Pytorch?Tensor?Numpy中如何使用

發布時間:2022-08-17 16:48:24 來源:億速云 閱讀:161 作者:iii 欄目:開發技術

本篇內容介紹了“Broadcast廣播機制在Pytorch Tensor Numpy中如何使用”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

1.什么是廣播機制

根據線性代數的運算規則我們知道,矩陣運算往往都是在兩個矩陣維度相同或者相匹配時才能運算。比如加減法需要兩個矩陣的維度相同,乘法需要前一個矩陣的列數與后一個矩陣的行數相等。那么在 numpy、tensor 里也是同樣的道理,但是在機器學習的某些算法中會出現兩個維度不相同也不匹配的矩陣進行運算,那么這時候就需要用廣播機制來解決,通過廣播機制,其tensor參數可以自動擴展為相等大小(不需要復制數據)。下面我們以tensor為例來解釋什么是廣播機制。

2.廣播機制的規則

先來說下廣播機制的規則,只有遵循下面的規則兩個張量才可以進行廣播運算。

每個tensor至少有一個維度;

遍歷tensor所有維度時,從末尾開始遍歷(從右往左開始遍歷),兩個tensor存在下列情況

tensor維度相等。

tensor維度不等且其中一個維度為1或者不存在。

滿足上面的條件才可以進行廣播機制。

3.代碼舉例

相同維度,一定可以 broadcast:

import torch
x = torch.rand(1, 2, 3)
y = torch.rand(1, 2, 3)
z = x + y
print(x.shape)
print(y.shape)
print(z.shape)
print(x)
print(y)
print(z)

輸出結果如下:

torch.Size([1, 2, 3])
torch.Size([1, 2, 3])
torch.Size([1, 2, 3])
tensor([[[0.0322, 0.2378, 0.4711],
         [0.9191, 0.0802, 0.4002]]])
tensor([[[0.5645, 0.9541, 0.3089],
         [0.7633, 0.7400, 0.7507]]])
tensor([[[0.5966, 1.1919, 0.7800],
         [1.6825, 0.8202, 1.1509]]])

有一個張量沒有維度,一定不可以進行 broadcast:

import torch
x = torch.rand(0)
y = torch.rand(1, 2, 3)
print(x.shape)
print(y.shape)
z = x + y
print(z.shape)
print(x)
print(y)
print(z)

輸出結果:

torch.Size([0])
torch.Size([1, 2, 3])
Traceback (most recent call last):
  File "D:/program/Test/broadcast/test.py", line 8, in <module>
    z = x + y
RuntimeError: The size of tensor a (0) must match the size of tensor b (3) at non-singleton dimension 2

有一個張量缺少維度,一定可以進行 broadcast:

import torch
x = torch.rand(1, 2, 3, 4)
y = torch.rand(2, 3, 4)
print(x.shape)
print(y.shape)
z = x + y
print(z.shape)
print(x)
print(y)
print(z)

輸出結果:

torch.Size([1, 2, 3, 4])
torch.Size([2, 3, 4])
torch.Size([1, 2, 3, 4])
tensor([[[[0.0094, 0.1863, 0.2657, 0.3782],
          [0.3296, 0.7454, 0.2080, 0.4156],
          [0.2092, 0.5414, 0.1053, 0.3872]],

         [[0.8161, 0.3554, 0.7352, 0.2116],
          [0.7459, 0.1662, 0.7555, 0.4548],
          [0.2611, 0.0353, 0.1862, 0.5948]]]])
tensor([[[0.4637, 0.3938, 0.2039, 0.3892],
         [0.4146, 0.8713, 0.3947, 0.5345],
         [0.2401, 0.3800, 0.3747, 0.8381]],

        [[0.0459, 0.1242, 0.3529, 0.1527],
         [0.2361, 0.2850, 0.8671, 0.8040],
         [0.6575, 0.4075, 0.8156, 0.2638]]])
tensor([[[[0.4730, 0.5801, 0.4695, 0.7674],
          [0.7442, 1.6167, 0.6027, 0.9501],
          [0.4493, 0.9214, 0.4800, 1.2253]],

         [[0.8620, 0.4796, 1.0881, 0.3643],
          [0.9820, 0.4512, 1.6227, 1.2588],
          [0.9186, 0.4428, 1.0018, 0.8586]]]])

上面的張量y跟張量x相比缺少一個維度,根據廣播機制的規則我們從最后一個維度進行匹配,后面三個維度都一樣,張量y的缺少一個維度,于是觸發廣播機制。

兩個張量的維度不相等,其中有一個張量的對應維度為1或者缺失,一定可以進行 broadcast:

import torch
x = torch.rand(1, 2, 3, 4)
y = torch.rand(2, 1, 1)
print(x.shape)
print(y.shape)
z = x + y
print(z.shape)
print(x)
print(y)
print(z)

輸出結果:

torch.Size([1, 2, 3, 4])
torch.Size([2, 1, 1])
torch.Size([1, 2, 3, 4])
tensor([[[[0.8670, 0.0134, 0.7929, 0.4109],
          [0.3595, 0.8457, 0.2819, 0.8470],
          [0.5040, 0.9281, 0.9161, 0.7305]],

         [[0.3798, 0.3866, 0.4680, 0.5744],
          [0.6984, 0.6501, 0.2235, 0.3099],
          [0.9861, 0.8598, 0.7635, 0.3238]]]])
tensor([[[0.3393]],

        [[0.1775]]])
tensor([[[[1.2062, 0.3527, 1.1322, 0.7501],
          [0.6987, 1.1850, 0.6212, 1.1863],
          [0.8433, 1.2674, 1.2554, 1.0698]],

         [[0.5574, 0.5641, 0.6455, 0.7519],
          [0.8759, 0.8276, 0.4010, 0.4875],
          [1.1636, 1.0373, 0.9410, 0.5013]]]])

以上就是廣播機制的操作,只要記住幾個規則就行了,注意tensor在進行運算的時候是從后往前匹配運算的。

4.原地操作

在進行廣播機制的時候我們要注意一個原地操作運算,什么是原地操作運算?原地操作運算就是指改變一個tensor的值的時候,不經過復制操作,而是直接在原來的內存上改變它的值。在pytorch中經常加后綴“”來代表原地操作符,例:.add _()、.scatter(),原地操作不允許tensor使用廣播機制那樣來改變張量形狀維度大小,如下例子所示。

import torch
x = torch.rand(1,3,1)
y = torch.rand(3,1,7)
print(x.shape)
print(y.shape)
z = x.add_(y)
print(z.shape)
print(x)
print(y)
print(z)

輸出結果:

torch.Size([1, 3, 1])
torch.Size([3, 1, 7])
Traceback (most recent call last):
  File "D:/program/Test/broadcast/test.py", line 8, in <module>
    z = x.add_(y)
RuntimeError: output with shape [1, 3, 1] doesn't match the broadcast shape [3, 3, 7]

“Broadcast廣播機制在Pytorch Tensor Numpy中如何使用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

涪陵区| 盱眙县| 榆中县| 旬邑县| 舟曲县| 西藏| 阳原县| 金秀| 临湘市| 永安市| 廊坊市| 宁蒗| 肇庆市| 天长市| 禹州市| 清徐县| 九龙县| 邢台市| 抚州市| 常宁市| 化州市| 上林县| 宾川县| 成都市| 剑川县| 武山县| 福海县| 库尔勒市| 兴义市| 罗江县| 巫山县| 达孜县| 敦煌市| 贵港市| 松江区| 策勒县| 西林县| 博客| 开远市| 齐齐哈尔市| 海淀区|