【问题标题】:Understanding the Tensorflow MNIST tutorial - Is the input x a column matrix or an array of column matrices?了解 Tensorflow MNIST 教程 - 输入 x 是列矩阵还是列矩阵数组?
【发布时间】:2016-12-06 14:36:21
【问题描述】:

我正在关注Tensorflow MNIST tutorial

通读理论/直觉部分,我开始理解x,输入,是一个列矩阵。

实际上,在描述softmax时,x显示为列矩阵:

但是,在tensorflow 中声明的 x 看起来像这样:

x = tf.placeholder(tf.float32, [None, 784])

我读到 x 是一个可变长度 ( None ) 的数组,该数组的每个元素都是一个大小为 784 的列矩阵。

尽管x 被声明为列矩阵数组,但它的使用就像它只是一个列矩阵:

y = tf.nn.softmax(tf.matmul(x, W) + b)

在示例中,Wb 被直观地声明为形状为 [784, 10][10] 的变量,这是有道理的。

我的问题是:

  1. Tensorflow 会自动对 x 中的每个列矩阵进行 softmax 操作吗?

  2. 我是否正确假设 [None, value] 直观地说是一个可变大小的数组,每个元素都是一个大小值的数组?或者 [None, value] 是否也可能意味着一个大小值数组? (没有它在容器数组中)

  3. 将理论描述(其中 x 是列向量)链接到实现(其中 x 是列矩阵数组)的正确方法是什么?

感谢您的帮助!

【问题讨论】:

  • 一个困扰我好几天的问题!在答案中添加了我的解释

标签: python machine-learning tensorflow mnist


【解决方案1】:

直觉是针对单个输入样本(这就是您看到列向量的原因)。然而,在实践中,训练是使用由许多输入样本组成的小批量来完成的。 (取决于batch_size)。

x = tf.placeholder(tf.float32, [None, 784])

这条线形成了一个维度矩阵? x 784,其中? 将表示批量大小。某种意义上的列向量已经成为这个新矩阵的行。

由于我们已将列向量转换为行,因此我们交换了 xW 的乘法顺序。这就是为什么您的W 具有784 x 10 的维度,而b 的维度10 将适用于所有元素。 在第一次乘法之后,x*W 有一个维度 ? x 10。相同的元素b 被添加到x*W 的每一行。因此,如果我的x*W 的第一行是[1,2,3,4,5,6,7,8,9,0] 并且b[1,1,1,1,1,1,1,1,1,1],则结果的第一行将是[2,3,4,5,6,7,8,9,10,1]。如果您觉得很难理解,请尝试转置W*x

回答您的问题,

Tensorflow 会自动对 x 中的每个列矩阵进行 softmax 操作吗?

是的,在您的上下文中。 TensorFlow 将softmax 应用于维度1 的所有元素(我在上面的解释中的所有行)。因此,您生成的 softmax 结果也将具有维度 ? x 10

我是否正确假设 [None, value] 直观地说是一个可变大小的数组,每个元素都是一个大小值的数组?或者 [None, value] 是否也可能意味着一个大小值数组? (没有它在容器数组中)

是的,前者是正确的解释。还请看我上面的? 矩阵类比。

将理论描述联系起来的正确方法是什么,其中x是列向量到实现,其中x是列矩阵数组?

我个人将其解释为 W*x 的转置。详细说明,让x 是多个列向量,[x1 x2 x3 x4 x5 ...] 具有维度784 x ?,其中? 是批量大小。让W 有一个维度10 x 784。如果你在每一列上应用W,你将得到[W*x1 W*x2 W*x3...]或多个维度为10的列向量,给出一个净矩阵维度10 x ?

对整个操作进行转置,trans(W*x) = trans(x)*trans(W),即代码中的xW

【讨论】:

  • 非常感谢您的详细解答!我会像你说的那样检查矩阵转置。行确实有意义。而且我想这也与输出的外观有关,即每个类的概率矩阵。
  • 希望对您有所帮助。如果有不清楚的地方请在此处发表评论,如果有帮助,请不要忘记将其作为正确答案接受
  • 谢谢!是的,现在确实有意义。我再次经历这个的原因是,我想对正在发生的事情有一个非常扎实的直觉,这样我就可以调整模型。我想更改模型以使用实际的 28x28 矩阵而不是压缩向量。我仍然不确定这将如何改变权重和偏差的外观。您对此有什么建议吗?本质上,我想更改模型以使 28x28 矩阵的边缘的权重小于中心。
  • 也许您可以从维度 ? x 28 x 28 的输入开始,并将维度为 ? 的数组的每个元素与维度为 28 x 28 的某个过滤器相乘,从而减少实际挤压前边缘的高值?我确信使用numpy 函数可以做到这一点,也许是numpy.dot 的某种形式?
  • 好的,我会试试的。感谢您的建议!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-19
  • 2017-05-03
  • 1970-01-01
  • 1970-01-01
  • 2019-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多