MNIST tensorflow教程对于matmul翻转技巧意味着什么?

时间:2017-08-06 20:31:24

标签: python tensorflow

关于ML初学者的MNIST教程,在Implementing the Regression中,展示了如何在一行上进行回归,然后是一个提及使用技巧的解释(强调我的):

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

首先,我们将x与表达式tf.matmul(x, W)相乘。这是从我们在我们的等式中乘以它们的时候翻转的,我们有Wx,作为小技巧来处理x是具有多个输入的2D张量。

这里的诀窍是什么,我们为什么要使用它?

2 个答案:

答案 0 :(得分:1)

嗯,这里没有诀窍。该线基本上指向一个先前的等式乘法顺序

# Here the order of W and x, this equation for single example
y = Wx +b
# if you want to use batch of examples you need the change the order of multiplication; instead of using another transpose op
y = xW +b
# hence
y = tf.matmul(x, W)

答案 1 :(得分:1)

好的,我认为主要的一点是,如果你批量训练(即一次训练有多个训练集的实例),TensorFlow总是假设x的第0维表示每个事件的数量。批量。

假设您要将维度M的训练实例映射到维度N的目标实例。通常通过将x(列向量)与NxM矩阵相乘来进行此操作(并且,可选地,添加维度为N的偏差) (也是列向量)),即

y = W * x + b,其中y也是列向量。

从线性代数的角度来看,这是完全正确的。但现在批量培训就是重点,即同时培训几个培训实例。 为了理解这一点,不将x(和y)视为维度M(和N)的向量,但作为矩阵Mx1(和y的Nx1)的矩阵可能会有所帮助。 由于TensorFlow假设构成批处理的不同训练实例沿着第零维度对齐,因此我们在这里遇到麻烦,因为第0维度被单个实例的不同元素占据。 然后诀窍是转置上面的等式(请记住,产品的转置也会切换两个转置对象的顺序):

y ^ T = x ^ T * W ^ T + b ^ T

这几乎就是教程中简要描述的内容。 注意,y ^ T现在是维度1xN(实际上是行向量)的矩阵,而x ^ T是维度1xM(也是行向量)的矩阵。 W ^ T是维度MxN的矩阵。在本教程中,他们没有写x ^ T或y ^ T,而只是根据这个转置公式定义了占位符。我不清楚的唯一一点是他们没有将b定义为“转置方式”。我假设+运算符会在必要时自动转置b以获得正确的维度。

其余部分现在非常简单:如果批量大于1个实例,则只需“堆叠”多个x(1xM)矩阵,比如维度矩阵(AxM)(其中A是批量大小)。希望b自动广播到这个数量的事件(这意味着维度矩阵(AxN)。如果你那么使用

y ^ T = x ^ T * W ^ T + b ^ T,

您将获得批次中每个元素的目标(AxN)矩阵。