在TensorFlow中,为什么一个m*n矩阵可以加n*1矩阵?

In TensorFlow, why a m*n matrix can add n * 1 matrix?

我是python和TensorFlow的新手,最近几天在学习"MNIST For ML Beginners"(https://www.tensorflow.org/get_started/mnist/beginners)时遇到了一个问题。

在本教程中,我们使用 y = tf.nn.softmax(tf.matmul(X, W) + b) 来获取输出。

我的问题是,比如X是[100,784]矩阵,W是[784,10]矩阵,b是[10]张量(像[10,1]矩阵?),之后我们调用 tf.matmul(X, W) 我们将得到一个 [100,10] 矩阵。这是我的问题,[100,10] 矩阵如何在此处添加 b[10] 张量?这对我来说没有任何意义。

我知道为什么会有偏差,我知道为什么需要添加偏差。但我只是不知道“+”运算符在这个问题上是如何工作的。

这是因为在 Numpy 和 TensorFlow 中都可以找到一个叫做 广播 的概念。在高层次上,它是这样工作的:

假设您正在使用支持广播(例如 + 或 *)并具有 2 个输入张量 X 和 Y 的运算符。为了评估 X 和 Y 的形状是否兼容,运算符将评估从右边开始成对的尺寸。如果满足以下条件,则尺寸被视为兼容:

  • 他们是平等的
  • 其中一个是1
  • 其中一个不见了

将这些规则应用于加法运算 (+) 以及形状 [100, 10] 和 [10] 的输入:

  • 10 和 10 兼容
  • 100 和 'missing' 兼容

如果形状兼容并且输入的维度之一为 1 或缺失,则操作基本上会平铺该输入以匹配其他输入的形状。

在您的示例中,加法操作会在执行加法之前有效地将形状 [10] 的 Y 平铺到形状 [100, 10]。

有关广播的详细信息,请参阅 Numpy 文档 (https://docs.scipy.org/doc/numpy-1.13.0/user/basics.broadcasting.html)