網(wǎng)站首頁 編程語言 正文
pytorch的廣播語義(broadcasting semantics),和numpy的很像,所以可以先看看numpy的文檔:
1、什么是廣播語義?
官方文檔有這樣一個解釋:
In short, if a PyTorch operation supports broadcast, then its Tensor arguments can be automatically expanded to be of equal sizes (without making copies of the data).
這句話的意思大概是:簡單的說,如果一個pytorch操作支持廣播,那么它的Tensor參數(shù)可以自動的擴展為相同的尺寸(不需要復制數(shù)據(jù))。
按照我的理解,應該是指算法計算過程中,不同的Tensor如果size
不同,但是符合一定的規(guī)則,那么可以自動的進行維度擴展,來實現(xiàn)Tensor
的計算。在維度擴展的過程中,并不是真的把維度小的Tensor復制為和維度大的Tensor相同,因為這樣太浪費內(nèi)存了。
2、廣播語義的規(guī)則
首先來看標準的情況,兩個Tensor的size相同,則可以直接計算:
x = torch.empty((4, 2, 3)) y = torch.empty((4, 2, 3))? print((x+y).size())?
輸出:
torch.Size([4, 2, 3])?
但是,如果兩個Tensor
的維度并不相同,pytorch也是可以根據(jù)下面的兩個法則進行計算:
- (1)Each tensor has at least one dimension.
- (2)When iterating over the dimension sizes, starting at the trailing dimension, the dimension sizes must either be equal, one of them is 1, or one of them does not exist.
- 每個
Tensor
至少有一個維度。- 迭代標注尺寸時,從后面的標注開始
第一個規(guī)則要求每個參與計算的Tensor
至少有一個維度,第二個規(guī)則是指在維度迭代時,從最后一個維度開始,可以有三種情況:
- 維度相等
- 其中一個維度是1
- 其中一個維度不存在
3、不符合廣播語義的例子
x = torch.empty((0, )) y = torch.empty((2, 3))? print((x + y).size())
輸出:
RuntimeError: The size of tensor a (0) must match ?the size of tensor b (3) at non-singleton dimension 1?
這里,不滿足第一個規(guī)則“每個參與計算的Tensor
至少有一個維度”。
x = torch.empty(5, 2, 4, 1)? y = torch.empty(3, 1, 1)? print((x + y).size())
輸出:
RuntimeError: The size of tensor a (2) must match?
the size of tensor b (3) at non-singleton dimension 1?
這里,不滿足第二個規(guī)則,因為從最后的維度開始迭代的過程中,倒數(shù)第三個維度:x是2,y是3。這并不符合第二條規(guī)則的三種情況,所以不能使用廣播語義。
4、符合廣播語義的例子
x = torch.empty(5, 3, 4, 1)? y = torch.empty(3, 1, 1)? print((x + y).size())?
輸出:
torch.Size([5, 3, 4, 1])?
x是四維的,y是三維的,從最后一個維度開始迭代:
- 最后一維:x是1,y是1,滿足規(guī)則二?
- 倒數(shù)第二維:x是4,y是1,滿足規(guī)則二?
- 倒數(shù)第三維:x是3,y是3,滿足規(guī)則一
- 倒數(shù)第四維:x是5,y是0,滿足規(guī)則一?
原文鏈接:https://zhuanlan.zhihu.com/p/338298069
相關推薦
- 2022-06-12 C語言棧與隊列相互實現(xiàn)詳解_C 語言
- 2022-04-25 JQuery實現(xiàn)Table的tr上移下移功能_jquery
- 2022-05-22 C++11?中的override詳解_C 語言
- 2023-01-19 Python中方法的缺省參數(shù)問題解讀_python
- 2022-11-03 anaconda?部署Jupyter?Notebook服務器過程詳解_python
- 2022-09-13 Android?Camera實現(xiàn)旋轉(zhuǎn)角度_Android
- 2022-04-02 Docker鏡像發(fā)布到Docker?Hub的實現(xiàn)方法_docker
- 2023-04-18 go實現(xiàn)服務優(yōu)雅關閉的示例_Golang
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支