【问题标题】:In TensorFlow, why a m*n matrix can add n * 1 matrix?在 TensorFlow 中,为什么一个 m*n 矩阵可以添加 n * 1 个矩阵?
【发布时间】:2023-05-01 22:59:02
【问题描述】:

我是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 中查看广播
  • (10,) 不是(10, 1)。向量不会自动成为矩阵、行向量或列向量。它只是一个向量。

标签: matrix tensorflow mnist softmax tensor


【解决方案1】:

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

假设您正在使用支持广播(例如 + 或 *)并具有 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)

【讨论】:

  • 非常感谢,它非常有用和有帮助。