Deep learning 矩阵乘法函数在TensorFlow中的应用

Deep learning 矩阵乘法函数在TensorFlow中的应用,deep-learning,tensorflow,Deep Learning,Tensorflow,我对TensorFlow中函数tf.matmul()的用法有点困惑。不过,我的问题可能更多的是关于深度学习的理论。假设你有一个输入X和权重矩阵W(假设零偏差),我想计算WX作为一个输出,它可以由tf.matmul(W,X)完成。但是,在本教程中,它是相反的,并且使用了tf.matmul(X,W)。另一方面,在下一个教程中,将使用tf.matmul(W,X)。由于矩阵大小对乘法很重要,我想知道是否有人能澄清这个问题。我想你一定是误读了力学101教程-或者你能指出具体的行吗 一般来说,对于网络层,我

我对TensorFlow中函数
tf.matmul()
的用法有点困惑。不过,我的问题可能更多的是关于深度学习的理论。假设你有一个输入X和权重矩阵W(假设零偏差),我想计算WX作为一个输出,它可以由
tf.matmul(W,X)
完成。但是,在本教程中,它是相反的,并且使用了
tf.matmul(X,W)
。另一方面,在下一个教程中,将使用
tf.matmul(W,X)
。由于矩阵大小对乘法很重要,我想知道是否有人能澄清这个问题。

我想你一定是误读了力学101教程-或者你能指出具体的行吗

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

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

这有一个很好的行为,即如果向
a
添加一个批处理维度,它仍然可以工作: a=np.数组[[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从输入特征到隐藏单元,或从一层隐藏单元到另一层隐藏单元时所做的操作。

我对TensorFlow了解不多,但直觉上我觉得混淆之处在于输入的数据表示。当你说你想把一个输入乘以一个权重时,我想你的意思是你想把每个维度(特征)乘以它相应的权重,然后求和。所以如果你有一个输入<代码> x>代码>用“代码> m <代码>维度,你应该有一个权重向量<代码> w <代码> > <代码> m <代码>值(<代码> m + 1 < /代码>如果你考虑偏倚)。
现在,如果您选择将不同的训练实例表示为矩阵的行
X
,则必须执行
X*w
,而如果您选择将它们表示为列,则需要执行
w^T*X

如果您希望在一个批处理中有多个训练实例,则需要使用
tf.batch\u matmul
,它在内部将第一个维度视为批处理维度。请记住,权重可以是矩阵,而不是向量:您可以根据输入特征的不同权重生成多个输出。我已经更新了我的答案来指出这一点。谢谢@jMathew。我认为你是对的。我假设输入应该表示为(n_特征x n_样本),但在大多数示例中似乎是相反的。dga,这与W是不是一个向量或者我们是在喂洗澡水无关。谢谢你的回答,但我还是很困惑。我们需要计算权重*输入,那么为什么不计算tf.matmul(权重,输入)?matmul(a,W)产生a*W而不是W*a。我这样想:假设你的权重矩阵中有5个激活,你希望这个计算有2个输出。层的“输入大小”为5,层的“输出”大小为2。此外,您还有一个批次大小B。我发现一个自然的表示是,您的输入是
[B,5]
,第一个维度是批次。如果将权重矩阵设置为
[5x2]
矩阵,则可以将任何批次大小乘以:
[B x 5]*[5 x 2]-->[B,2]
。当然,您可以转置两个矩阵并相乘
W\u t*a\u t
。不幸的是,正如这里所讨论的:np.dot与tf.matmul语义不匹配-特别是,两个操作数都必须是矩阵。有解决办法吗?
>>> np.dot(a, W)
array([[  7.4,   6.2],
       [ 20.9,  17.7]])