在TensorFlow中使用矩阵乘法函数

时间:2015-12-15 22:31:23

标签: deep-learning tensorflow

我对在TensorFlow中使用函数tf.matmul()感到有些困惑。不过,我的问题可能更多是关于深度学习的理论。假设您有一个输入X和权重矩阵W(假设零偏差),我想将WX计算为输出,可以由tf.matmul(W, X)完成。但是,在教程MNIST for beginners中,它被反转,而使用tf.matmul(X, W)代替。另一方面,在下一个教程TensorFlow Mechanics 101中,使用了tf.matmul(W, X)。由于矩阵大小对乘​​法很重要,我想知道是否有人可以澄清这个问题。

2 个答案:

答案 0 :(得分:5)

我认为你必须误读机制101教程 - 或者你能指出具体的一行吗?

一般来说,对于网络层,我想到输入"流经"重量。为了表示这一点,我写tf.matmul(Inputs, Weights)来生成该层的输出。然后,该输出可能会向其添加偏差b,并将其结果输入非线性函数(如relu),然后输入另一个tf.matmul作为下一层的输入。

其次,请记住,权重矩阵的大小可能会产生多个输出。这就是为什么它是一个矩阵,而不仅仅是一个向量。例如,如果你想要两个隐藏单位并且你有五个输入特征,你可以使用一个形状[5, 2]权重矩阵,就像这样(为了便于说明,显示在numpy中 - 你可以在tensorflow中做同样的事情):

import numpy as np
a = np.array([1, 2, 3, 4, 5])
W = np.array([[.5, .6], [.7, .8], [.9, .1], [.2, .3], [.4, .5]])

>>> np.dot(a, W)
array([ 7.4,  6.2])

这有一个很好的行为,如果您然后将批量维度添加到a,它仍然有效:     a = np.array [[1,2,3,4,5],                  [6,7,8,9,0]]

>>> np.dot(a, W)
array([[  7.4,   6.2],
       [ 20.9,  17.7]])

当您使用tf.matmul从输入要素转到隐藏单位,或从隐藏单位的一层到另一层时,这正是您正在做的事情。

答案 1 :(得分:2)

我对TensorFlow不太了解,但直觉上我觉得混淆是关于输入的数据表示。当您说要将输入X乘以权重W时,我认为您的意思是您希望将每个维度(要素)与其相应的权重相乘并取总和。因此,如果您的输入x具有说m维度,那么如果您考虑偏差,则应该具有wm的权重向量m+1

现在,如果您选择将不同的训练实例表示为矩阵X的行,则必须执行X * w,而如果您选择将它们表示为列,则可以执行w^T * X 1}}