2016-12-06 73 views
2

我正在关注Tensorflow MNIST tutorial了解Tensorflow MNIST教程 - 输入是列矩阵还是列矩阵数组?

通过理论/直觉部分的阅读,我开始理解x,输入,作为列矩阵。

事实上,描述softmax时,x被示出为列矩阵:

softmax intuition, with x clearly being shown as a column matrix

然而,在tensorflow声明中,x是这样的:

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

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

即使x被声明为列矩阵的阵列,它被用作如果这只是一个列矩阵:

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

在该示例中,Wb被intuitivly声明,作为形状[784, 10]的变量和[10] respectivly,这是有道理的。

我的问题是:

  1. 不Tensorflow自动为X每一列矩阵执行操作添加Softmax?

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

  3. 链接理论描述的正确方法是什么?其中x是列向量与实现的关系,其中x是列矩阵的数组?

感谢您的帮助!

+0

一个让我困惑的日子!在答案中添加了我的解释 – martianwars

回答

4

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

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

这条线使尺寸? x 784其中?将表示批量大小的矩阵。在某种意义上列向量已经成为这个新矩阵的行。

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

来到你的问题,

不Tensorflow自动为X每一列矩阵执行操作添加Softmax?

是的,在你的上下文中。 TensorFlow在尺寸为1的所有元素上应用softmax(上面解释的所有行)。所以你的结果softmax结果也将有尺寸? x 10

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

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

链接理论描述的正确方法是什么?其中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

+1

非常感谢您的详细解答!我会像你说的那样检查矩阵转置。它对行有意义。我想这也与输出看起来有关,即每个类别的概率矩阵。 – mayk93

+0

我希望它对你有所帮助。如果有什么不明之处,请在这里评论,如果有帮助,请不要忘记接受这个正确的答案 – martianwars

+0

谢谢!是的,它现在确实有道理。我再次经历这个问题的原因是,我想对所发生的事情有一个非常坚实的直觉,以便我可以调整模型。我想改变模型以使用实际的28x28矩阵而不是压缩矢量。我仍不确定这将如何改变权重和偏见的外观。你有什么建议吗?基本上,我想改变模型来加权比28x28矩阵的边缘更小的中心。 – mayk93