了解 Tensorflow MNIST 教程 - 输入 x 是列矩阵还是列矩阵数组?

Understanding the Tensorflow MNIST tutorial - Is the input x a column matrix or an array of column matrices?

我正在关注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. link 理论描述的正确方法是什么,其中 x 是实现的列向量,其中 x 是列矩阵数组?

感谢您的帮助!

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

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

此行构成一个维度为 ? x 784 的矩阵,其中 ? 表示批量大小。从某种意义上说,列向量已成为这个新矩阵的行。

由于我们已将列向量转换为行,因此我们交换了 xW 的乘法顺序。这就是为什么 W 的维度为 784 x 10b 的维度 10 将应用于所有元素。 在第一次乘法之后,x*W 有一个维度 ? x 10x*W 的每一行都添加了相同的元素 b。因此,如果我的 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.

回答您的问题,

Does Tensorflow automatically perform the softmax operation for each column matrix in x?

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

Am I correct in assuming [None, value] means, intuitivly, an array of variable size with each element being an array of size value? Or is it possible for [None, value] to also mean just an array of size value? ( without it being in a container array )

是的,前者是正确的解释。另请参阅上面我的 ? 矩阵类比。

What is the correct way to link the theoretical description, where x is a column vector to the implementation, where x is an array of column matrices?

我个人将其解释为 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