網站首頁 編程語言 正文
1. Pytorch中的廣播機制
如果一個Pytorch運算支持廣播的話,那么就意味著傳給這個運算的參數會被自動擴張成相同的size,在不復制數據的情況下就能進行運算,整個過程可以做到避免無用的復制,達到更高效的運算。
廣播機制實際上是在運算過程中,去處理兩個形狀不同向量的一種手段。
pytorch中的廣播機制和numpy中的廣播機制一樣, 因為都是數組的廣播機制。
2. 廣播機制的理解
以數組A和數組B的相加為例, 其余數學運算同理
核心:如果相加的兩個數組的shape不同, 就會觸發廣播機制:
1)程序會自動執行操作使得A.shape==B.shape;
2)對應位置進行相加運算,結果的shape是:A.shape和B.shape對應位置的最大值,比如:A.shape=(1,9,4),B.shape=(15,1,4),那么A+B的shape是(15,9,4)
3. 兩個張量進行廣播機制的條件
3.1 兩個張量都至少有一個維度
#像下面這種情況下就不行,因為x不滿足這個條件。
x=torch.empty((0,))
y=torch.empty(2,2)
3.2 按從右往左順序看兩個張量的每一個維度,x和y每個對應著的兩個維度都需要能夠匹配上。
什么情況下算是匹配上了?滿足下面的條件就可以:
- a.這兩個維度的大小相等
- b. 某個維度 一個張量有,一個張量沒有
- c.某個維度 一個張量有,一個張量也有但大小是1
如下舉例:
x=torch.empty(5,3,4,1)
y=torch.empty( 3,1,1)
如上面代碼中,首先將兩個張量維度向右靠齊,從右往左看,兩個張量第四維大小相等,都為1,滿足上面條件a;第三個維度大小不相等,但第二個張量第三維大小為1,滿足上面條件b;第二個維度大小相等都為3,滿足上面條件a;第一個維度第一個張量有,第二個張量沒有,滿足上面條件b,因此兩個張量每個維度都符合上面廣播條件,因此可以進行廣播。
兩個張量維度從右往左看,如果出現兩個張量在某個維度位置上面,維度大小不相等,且兩個維度大小沒有一個是1,那么這兩個張量一定不能進行廣播。
4. 當兩個張量滿足可廣播條件后
具體怎么進行廣播
x=torch.empty(5,3,4,1)
y=torch.empty( 3,1,1)
如上面代碼所示:
a. 首先第一步,將上面條件b的類型變成條件c的類型,也即是把第二個張量在缺失維度的位置上新增一個維度,維度大小為1,新增的維度如下面所示。
統一前:
x=torch.empty(5,3,4,1)
y=torch.empty( 3,1,1)
統一后:
x=torch.empty(5,3,4,1)
y=torch.empty(1,3,1,1)
b. 第二步,x、y對應維度不等的位置,把size為1的維度會被廣播得和對應維度一樣大,比如y中0維的1會變成5,y中2維的1會變成4,最后兩個張量的維度大小變成一樣,然后再進行張量運算,轉變的維度如下所示。
統一前:
x=torch.empty(5,3,4,1)
y=torch.empty(1,3,1,1)
統一后:
x=torch.empty(5,3,4,1)
y=torch.empty(5,3,4,1)
5. 從空間上理解廣播機制
5.1 一維張量進行廣播,b被自動廣播得和a一樣的維度大小,完成了張量相乘運算,如下圖所示。
a = torch.tensor([1,2,3])
b = torch.tensor([2])
c = a*b
a,a.shape,b,b.shape,c,c.shape
輸出結果如下:
(tensor([1, 2, 3]),
?torch.Size([3]),
?tensor([2]),
?torch.Size([1]),
?tensor([2, 4, 6]),
?torch.Size([3]))
5.1 二維張量進行廣播,b被自動廣播得和a一樣的維度大小,完成了張量相加運算,如下圖所示。
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
輸出結果如下:
(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]))
上面二維張量和一維張量相加運算進行廣播過程為:a的形狀是(4,1),b的形狀是(3),如果a和b要匹配上,第一步給b新添一個維度,我們有:a的形狀是(4,1),b的形狀是(1,3);第二步二者各自把為1的維度進行廣播,就如上圖中那樣進行廣播,最后運算完成。
總結
原文鏈接:https://blog.csdn.net/flyingluohaipeng/article/details/125107959
相關推薦
- 2022-04-09 node sass下載失敗解決方案
- 2022-05-07 Python中的集合一起來學習一下_python
- 2022-11-17 Android自定義一個view?ViewRootImpl繪制流程示例_Android
- 2022-11-24 AOP?Redis自定義注解實現細粒度接口IP訪問限制_Redis
- 2022-06-29 Tomcat配置訪問日志和線程數的實現步驟_Tomcat
- 2022-05-13 python魔法方法之__setattr__()_python
- 2022-10-21 C#中匿名方法與委托的關系介紹_C#教程
- 2023-01-03 Redis實現優惠券限一單限制詳解_Redis
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支