在TensorFlow中使用矩阵乘法函数

ser*_*ore 6 deep-learning tensorflow

我对tf.matmul()在TensorFlow中使用该函数感到有点困惑.不过,我的问题可能更多是关于深度学习的理论.假设你有一个输入X和权重矩阵W(假设零偏差),我想计算WX作为输出,可以通过tf.matmul(W, X).但是,在初学者的教程MNIST中,它是相反的,tf.matmul(X, W)而是用来代替.在另一方面,在接下来的教程TensorFlow机械101,tf.matmul(W, X)被使用.由于矩阵大小对于乘法很重要,我想知道是否有人可以澄清这个问题.

dga*_*dga 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])
Run Code Online (Sandbox Code Playgroud)

这有一个很好的行为,如果你然后添加批量维度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]])
Run Code Online (Sandbox Code Playgroud)

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


jMa*_*hew 3

我对 TensorFlow 了解不多,但直觉上我觉得困惑在于输入的数据表示。当您说要将输入乘以X权重时W,我认为您的意思是要将每个维度(特征)与其相应的权重相乘并求和。因此,如果您有一个x具有特定m维度的输入,您应该有一个w带有m值的权重向量(m+1如果您考虑偏差)。

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