BROADCASTING SEMANTICS(广播语义)

一般语义

如果遵守以下规则,则两个张量是“可广播的”:

  • 每个张量至少有一个维度;
  • 遍历张量维度大小时,从末尾部开始遍历,两个张量的维度大小必须相等,或它们其中一个为1,或者一个不存在。

如果x,y两个张量是可以广播的,则通过计算得到的张量大小遵循以下原则:

  • 如果x和y的维数不相等,则在维度较小的张量的前面增加1个维度,使它们的长度相等。
  • 然后,生成新张量维度的大小是x和y在每个维度上的最大值

In - place 语义

一个复杂因素是in-place操作不允许in-place张量像广播那样改变形状。

例如:

>>> x=torch.empty(5,3,4,1)
>>> y=torch.empty(3,1,1)
>>> (x.add_(y)).size()
torch.Size([5, 3, 4, 1])

# but:
>>> x=torch.empty(1,3,1)
>>> y=torch.empty(3,1,7)
>>> (x.add_(y)).size()
RuntimeError: The expanded size of the tensor (1) must match the existing size (7) at non-singleton dimension 2.

向后兼容性

PyTorch的早期版本允许某些逐点函数在具有不同形状的张量上执行,只要每个张量中的元素数量相等即可。 然后通过将每个张量视为1维来执行逐点运算。PyTorch现在支持广播,并且“1维”逐点行为被认为已弃用,并且在张量不可广播但具有相同数量的元素的情况下将生成Python警告。

注意,在两个张量不具有相同形状但是可广播并且具有相同数量元素的情况下,广播的引入可能导致向后不兼容。例如:

>>> torch.add(torch.ones(4,1), torch.randn(4))

以前可能会产生一个torch.Size([4,1])的Tensor,但现在会产生一个torch.Size([4,4])这样的Tensor。 为了帮助识别代码中可能存在广播引起的向后不兼容性的情况,您可以设置torch.utils.backcompat.broadcast_warning.enabledTrue,在这种情况下会产生python警告。

>>> torch.utils.backcompat.broadcast_warning.enabled=True
>>> torch.add(torch.ones(4,1), torch.ones(4))
__main__:1: UserWarning: self and other do not have the same shape, but are broadcastable, and have the same number of elements.
Changing behavior in a backwards incompatible manner to broadcasting rather than viewing as 1-dimensional.

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • pytorch torch包 torch 包含了多维张量的数据结构以及基于其上的多种数学操作。 函数 torch....
    NJUST江波阅读 4,748评论 0 0
  • Tensor的创建除了构造器,还提供了工厂模式的创建方式:函数,同时提供了基本运算函数的封装。本主题就专门数理这些...
    杨强AT南京阅读 6,549评论 0 1
  • 【七月未央】20180516学习力践行D314 1.阅读: 手指谣:复习月亮圆圆,我自己编了些手势一起玩了玩。读到...
    七妈_haiyan阅读 3,385评论 0 51
  • 27与28只差一岁,28与29只差一岁,对于未婚的人是一年一个心态,国庆节依旧忙碌的节日,相亲的节日,今年可能...
    sixrain阅读 3,762评论 0 0
  • 孙玉芳 坚持原创分享第646天 2020年1月7日 洛阳伊川 又一次监考,又一次看到试卷都有右上角缺小小的一角,这...
    b70addc5295b阅读 2,299评论 0 0

友情链接更多精彩内容