我对在TensorFlow中使用函数tf.matmul()
感到有些困惑。不过,我的问题可能更多是关于深度学习的理论。假设您有一个输入X和权重矩阵W(假设零偏差),我想将WX计算为输出,可以由tf.matmul(W, X)
完成。但是,在教程MNIST for beginners中,它被反转,而使用tf.matmul(X, W)
代替。另一方面,在下一个教程TensorFlow Mechanics 101中,使用了tf.matmul(W, X)
。由于矩阵大小对乘法很重要,我想知道是否有人可以澄清这个问题。
答案 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
维度,那么如果您考虑偏差,则应该具有w
值m
的权重向量m+1
现在,如果您选择将不同的训练实例表示为矩阵X
的行,则必须执行X * w
,而如果您选择将它们表示为列,则可以执行w^T * X
1}}