Pytorch中的廣播機(jī)制詳解(Broadcast)
1. Pytorch中的廣播機(jī)制
如果一個Pytorch運(yùn)算支持廣播的話,那么就意味著傳給這個運(yùn)算的參數(shù)會被自動擴(kuò)張成相同的size,在不復(fù)制數(shù)據(jù)的情況下就能進(jìn)行運(yùn)算,整個過程可以做到避免無用的復(fù)制,達(dá)到更高效的運(yùn)算。
廣播機(jī)制實(shí)際上是在運(yùn)算過程中,去處理兩個形狀不同向量的一種手段。
pytorch中的廣播機(jī)制和numpy中的廣播機(jī)制一樣, 因?yàn)槎际菙?shù)組的廣播機(jī)制。
2. 廣播機(jī)制的理解
以數(shù)組A和數(shù)組B的相加為例, 其余數(shù)學(xué)運(yùn)算同理
核心:如果相加的兩個數(shù)組的shape不同, 就會觸發(fā)廣播機(jī)制:
1)程序會自動執(zhí)行操作使得A.shape==B.shape;
2)對應(yīng)位置進(jìn)行相加運(yùn)算,結(jié)果的shape是:A.shape和B.shape對應(yīng)位置的最大值,比如:A.shape=(1,9,4),B.shape=(15,1,4),那么A+B的shape是(15,9,4)
3. 兩個張量進(jìn)行廣播機(jī)制的條件
3.1 兩個張量都至少有一個維度
#像下面這種情況下就不行,因?yàn)閤不滿足這個條件。 x=torch.empty((0,)) y=torch.empty(2,2)
3.2 按從右往左順序看兩個張量的每一個維度,x和y每個對應(yīng)著的兩個維度都需要能夠匹配上。
什么情況下算是匹配上了?滿足下面的條件就可以:
- a.這兩個維度的大小相等
- b. 某個維度 一個張量有,一個張量沒有
- c.某個維度 一個張量有,一個張量也有但大小是1
如下舉例:
x=torch.empty(5,3,4,1) y=torch.empty( 3,1,1)
如上面代碼中,首先將兩個張量維度向右靠齊,從右往左看,兩個張量第四維大小相等,都為1,滿足上面條件a;第三個維度大小不相等,但第二個張量第三維大小為1,滿足上面條件b;第二個維度大小相等都為3,滿足上面條件a;第一個維度第一個張量有,第二個張量沒有,滿足上面條件b,因此兩個張量每個維度都符合上面廣播條件,因此可以進(jìn)行廣播。
兩個張量維度從右往左看,如果出現(xiàn)兩個張量在某個維度位置上面,維度大小不相等,且兩個維度大小沒有一個是1,那么這兩個張量一定不能進(jìn)行廣播。
4. 當(dāng)兩個張量滿足可廣播條件后
具體怎么進(jìn)行廣播
x=torch.empty(5,3,4,1) y=torch.empty( 3,1,1)
如上面代碼所示:
a. 首先第一步,將上面條件b的類型變成條件c的類型,也即是把第二個張量在缺失維度的位置上新增一個維度,維度大小為1,新增的維度如下面所示。
統(tǒng)一前: x=torch.empty(5,3,4,1) y=torch.empty( 3,1,1) 統(tǒng)一后: x=torch.empty(5,3,4,1) y=torch.empty(1,3,1,1)
b. 第二步,x、y對應(yīng)維度不等的位置,把size為1的維度會被廣播得和對應(yīng)維度一樣大,比如y中0維的1會變成5,y中2維的1會變成4,最后兩個張量的維度大小變成一樣,然后再進(jìn)行張量運(yùn)算,轉(zhuǎn)變的維度如下所示。
統(tǒng)一前: x=torch.empty(5,3,4,1) y=torch.empty(1,3,1,1) 統(tǒng)一后: x=torch.empty(5,3,4,1) y=torch.empty(5,3,4,1)
5. 從空間上理解廣播機(jī)制
5.1 一維張量進(jìn)行廣播,b被自動廣播得和a一樣的維度大小,完成了張量相乘運(yùn)算,如下圖所示。
a = torch.tensor([1,2,3]) b = torch.tensor([2]) c = a*b a,a.shape,b,b.shape,c,c.shape
輸出結(jié)果如下:
(tensor([1, 2, 3]),
torch.Size([3]),
tensor([2]),
torch.Size([1]),
tensor([2, 4, 6]),
torch.Size([3]))
5.1 二維張量進(jìn)行廣播,b被自動廣播得和a一樣的維度大小,完成了張量相加運(yùn)算,如下圖所示。
a = torch.tensor([[0],[10],[20],[30]]) b = torch.tensor([1,2,3]) c = a+b a,a.shape,b,b.shape,c,c.shape
輸出結(jié)果如下:
(tensor([[ 0],
[10],
[20],
[30]]),
torch.Size([4, 1]),
tensor([1, 2, 3]),
torch.Size([3]),
tensor([[ 1, 2, 3],
[11, 12, 13],
[21, 22, 23],
[31, 32, 33]]),
torch.Size([4, 3]))
上面二維張量和一維張量相加運(yùn)算進(jìn)行廣播過程為:a的形狀是(4,1),b的形狀是(3),如果a和b要匹配上,第一步給b新添一個維度,我們有:a的形狀是(4,1),b的形狀是(1,3);第二步二者各自把為1的維度進(jìn)行廣播,就如上圖中那樣進(jìn)行廣播,最后運(yùn)算完成。
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
python實(shí)現(xiàn)H2O中的隨機(jī)森林算法介紹及其項(xiàng)目實(shí)戰(zhàn)
這篇文章主要介紹了python實(shí)現(xiàn)H2O中的隨機(jī)森林算法介紹及其項(xiàng)目實(shí)戰(zhàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08Python實(shí)現(xiàn)隨機(jī)游走的示例代碼
隨機(jī)游走是一個數(shù)學(xué)對象,稱為隨機(jī)或隨機(jī)過程,它描述了一條路徑,該路徑由一些數(shù)學(xué)空間上的一系列隨機(jī)步驟組成,下面我們就來學(xué)習(xí)一下Python如何實(shí)現(xiàn)隨機(jī)游走的吧2023-12-12Python使用tkinter實(shí)現(xiàn)搖骰子小游戲功能的代碼
這篇文章主要介紹了Python使用tkinter實(shí)現(xiàn)的搖骰子小游戲功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07python實(shí)現(xiàn)將兩個文件夾合并至另一個文件夾(制作數(shù)據(jù)集)
這篇文章主要介紹了python實(shí)現(xiàn)將兩個文件夾合并至另一個文件夾(制作數(shù)據(jù)集),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04python實(shí)現(xiàn)差分隱私Laplace機(jī)制詳解
今天小編就為大家分享一篇python實(shí)現(xiàn)差分隱私Laplace機(jī)制詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11Python使用MD5加密算法對字符串進(jìn)行加密操作示例
這篇文章主要介紹了Python使用MD5加密算法對字符串進(jìn)行加密操作,結(jié)合實(shí)例形式分析了Python實(shí)現(xiàn)md5加密相關(guān)操作技巧,需要的朋友可以參考下2018-03-03