MXNet中NDArray中的广播运算条件

问题

《动手学深度学习》(By Aston Zhang, Mu Li, Zachary C.Lipton, Alexander J.Smola)中介绍NDArray中的广播运算时并没有说清楚广播运算的条件。但是,此运算在此书后续代码中广泛使用,结合网络上的搜索,特别详解如下。

详解

情况一:两个形状相同的NDArray按元素运算,不需要广播机制。

情况二:当形状不同时,这两个NDArray按元素运算还有可能进行

条件是:这两个NDArray的形状要“兼容”。所谓“兼容”是指:

为了确定两个形状是否是可兼容的,需要从最后开始往前逐个比较它们的维度(dimensions)大小。比较过程中,如果两者的对应维度相同,或者其中之一(或者全是)等于1,比较继续进行直到最前面的维度。否则,你将看到ValueError错误出现("operands could not be broadcast together with shapes ...")。

当其中之一的形状的维度超出范围(例如,a1 的shape=(2,3,4)而a2的shape=(3,4),当a1的2超出a2范围),此时Numpy将会使用1进行比较(如将a2.shape替换为(1,3,4))直到另一个也超出dim范围。

一旦Numpy确定两者的形状是可兼容的,最终结果的形状就成了每个维度上取两者之间最大的形状尺寸。

举例1

A=nd.arange(3).reshape((3,1))
B=nd.arange(2).reshape((1,2))
A+B可以进行,结果的形状为(3,2)

举例2

a=nd.arange(6).reshape((1,6))
b=nd.arange(8).reshape((8,1))
A+B可以进行,结果的形状为(8,6)

举例3

a=nd.arange(6).reshape((1,6))
b=nd.arange(8).reshape((4,2,1))

A+B可以进行,结果的形状为(4,2,6)

反例

a=nd.arange(6).reshape((3,2))
b=nd.arange(8).reshape((8,1))
A+B不可以进行,抛出错误!

猜你喜欢

转载自blog.51cto.com/zhuxianzhong/2412409