广播语义学
许多PyTorch操作支持NumPy的广播语义。看见 https://numpy.org/doc/stable/user/basics.broadcasting.html详情请见。
简而言之,如果PyTorch操作支持广播,那么它的张量参数可以自动扩展为相同的大小(无需复制数据)。
普通语义学
如果下列规则成立,则两个张量是“可广播的”:
- 每个张量至少有一维。
- 当迭代维度大小时,从尾部维度开始,维度大小必须相等,其中一个为1,或者其中一个不存在。
例如:
如果两个张量x
, y
是“可广播的”,结果张量大小计算如下:
- 如果的维数
x
和y
不相等,则在维数较少的张量的维数前加1,使它们长度相等。 - 然后,对于每个维度大小,生成的维度大小是
x
和y
沿着那个维度。
例如:
原地语义
一个复杂的问题是,原位操作不允许原位张量由于广播而改变形状。
例如:
向后兼容性
PyTorch的早期版本允许在不同形状的张量上执行某些逐点函数,只要每个张量中的元素数量相等。逐点运算将通过把每个张量看作一维来进行。PyTorch现在支持广播,并且“一维”逐点行为被认为是不推荐的,并且在张量不可广播但具有相同数量的元素的情况下会生成Python警告。
请注意,在两个张量不具有相同的形状,但可广播并具有相同数量的元素的情况下,广播的引入会导致向后不兼容的变化。例如:
会产生一个大小为torch的张量。Size([4,1]),但现在产生了一个带Size的张量:torch。大小([4,4])。为了帮助识别代码中可能存在由广播引入的向后不兼容的情况,可以将torch . utils . back compat . broadcast _ warning . enabled到真实的,这将在这种情况下生成python警告。
例如: