难以理解张量的广播行为

Trouble Understanding broadcasting behavior for tensors

我正在尝试对维度 (1,5,64) 和 (1,5) 的两个张量进行逐元素乘法。据我所知,尽管它们的尺寸不匹配,广播应该允许这个工作。所以,我使用这个代码:

x = tf.range(0,64*5)
x = tf.reshape(x, [1,5, 64])

y = tf.range(0,5)
y = tf.reshape(y, [1, 5])

prodct = x*y

这会导致此错误:

InvalidArgumentError: Incompatible shapes: [1,5,64] vs. [1,5] [Op:Mul]

但是,如果我将第一个张量重塑为维度 (1,64,5),那么它就可以工作。代码:

x = tf.range(0,64*5)
x = tf.reshape(x, [1,64, 5])

y = tf.range(0,5)
y = tf.reshape(y, [1, 5])

prodct = x*y

我不明白为什么第一个代码不起作用。

General Broadcasting Rules, when operating on two arrays, 按元素比较它们的形状。它从尾随(即 最右边)维度开始,并向左移动。

时二维兼容
  • 它们相等,或者
  • 其中一个是1

如果不满足这些条件,将抛出 ValueError: operands could not be broadcast together 异常,表明数组具有不兼容的形状。结果数组的大小是沿输入的每个轴不为 1 的大小。

also follows the same spirit. Check the documentation 了解更多示例和详细信息。对于您的情况,最右边的维度不符合规则并引发错误。

1, 5, 64
   1, 5

但这会起作用,因为它遵守规则。

1, 64, 5
   1,  5

代码

, and in 供参考。

import numpy as np 
a = np.arange(64*5).reshape(1, 64, 5)
b = np.arange(5).reshape(1,5)
(a*b).shape
(1, 64, 5)

import tensorflow as tf 
x = tf.reshape(tf.range(0,64*5), [1, 64, 5])
y = tf.reshape(tf.range(0,5), [1, 5])
(x*y).shape
TensorShape([1, 64, 5])