TensorFlow中矩阵乘法函数的使用
Use of matrix multiplication function in TensorFlow
我对 TensorFlow 中函数 tf.matmul()
的使用有点困惑。不过,我的问题可能更多是关于深度学习的理论。假设您有一个输入 X 和权重矩阵 W(假设偏差为零),我想将 WX 计算为输出,这可以通过 tf.matmul(W, X)
完成。但是,在教程中 MNIST for beginners it is reversed and tf.matmul(X, W)
is used instead. On the other hand, in the next tutorial TensorFlow Mechanics 101,使用 tf.matmul(W, X)
。由于矩阵大小对于乘法很重要,我想知道是否有人可以澄清这个问题。
我认为您一定是误读了力学 101 教程 - 或者您能指出具体的行吗?
一般来说,对于网络层,我认为输入 "flowing through" 是权重。为了表示这一点,我写 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 从输入特征到隐藏单元,或从一层隐藏单元到另一层时所做的。
我对 TensorFlow 了解不多,但直觉上我觉得混淆是关于输入的数据表示。当您说要将输入 X
与权重 W
相乘时,我认为您的意思是您希望将每个维度(特征)与其相应的权重相乘并求和。因此,如果您的输入 x
具有 m
维度,则您应该具有具有 m
值的权重向量 w
(如果考虑偏差,则为 m+1
) .
现在,如果您选择将不同的训练实例表示为矩阵的行 X
,则必须执行 X * w
,而如果您选择将它们表示为列,则需要执行w^T * X
我对 TensorFlow 中函数 tf.matmul()
的使用有点困惑。不过,我的问题可能更多是关于深度学习的理论。假设您有一个输入 X 和权重矩阵 W(假设偏差为零),我想将 WX 计算为输出,这可以通过 tf.matmul(W, X)
完成。但是,在教程中 MNIST for beginners it is reversed and tf.matmul(X, W)
is used instead. On the other hand, in the next tutorial TensorFlow Mechanics 101,使用 tf.matmul(W, X)
。由于矩阵大小对于乘法很重要,我想知道是否有人可以澄清这个问题。
我认为您一定是误读了力学 101 教程 - 或者您能指出具体的行吗?
一般来说,对于网络层,我认为输入 "flowing through" 是权重。为了表示这一点,我写 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 从输入特征到隐藏单元,或从一层隐藏单元到另一层时所做的。
我对 TensorFlow 了解不多,但直觉上我觉得混淆是关于输入的数据表示。当您说要将输入 X
与权重 W
相乘时,我认为您的意思是您希望将每个维度(特征)与其相应的权重相乘并求和。因此,如果您的输入 x
具有 m
维度,则您应该具有具有 m
值的权重向量 w
(如果考虑偏差,则为 m+1
) .
现在,如果您选择将不同的训练实例表示为矩阵的行 X
,则必须执行 X * w
,而如果您选择将它们表示为列,则需要执行w^T * X