我正在尝试了解TensorFlow代码段。我被教导的是,我们将所有传入的输入求和,然后将它们传递给激活函数。下图显示了单个神经元。注意,我们计算输入的加权和,然后计算激活。
在多层感知器的大多数示例中,它们不包括求和步骤。我觉得这很令人困惑。
以下是其中一个片段的示例:
weights = {
'h1': tf.Variable(tf.random_normal([n_input, n_hidden_1])),
'h2': tf.Variable(tf.random_normal([n_hidden_1, n_hidden_2])),
'out': tf.Variable(tf.random_normal([n_hidden_2, n_classes]))
}
biases = {
'b1': tf.Variable(tf.random_normal([n_hidden_1])),
'b2': tf.Variable(tf.random_normal([n_hidden_2])),
'out': tf.Variable(tf.random_normal([n_classes]))
}
# Create model
def multilayer_perceptron(x):
# Hidden fully connected layer with 256 neurons
layer_1 = tf.nn.relu(tf.add(tf.matmul(x, weights['h1']), biases['b1']))
# Hidden fully connected layer with 256 neurons
layer_2 = tf.nn.relu(tf.add(tf.matmul(layer_1, weights['h2']), biases['b2']))
# Output fully connected layer with a neuron for each class
out_layer = tf.nn.relu(tf.matmul(layer_2, weights['out']) + biases['out'])
return out_layer
在每一层中,我们首先将输入乘以weights
。然后,我们添加bias
项。然后,将它们传递给tf.nn.relu
。求和在哪里发生?看来我们已经跳过了!
任何帮助都将非常棒!
答案 0 :(得分:2)
模型out_layer
的最后一层输出每个类Prob(y=yi|X)
的概率,形状为[batch_size, n_classes]
。要计算这些概率,请softmax
功能已应用。对于模型接收到的每个单个输入数据点x
,其输出的概率向量y
的类数为大小。然后,通过在输出向量argmax
上应用class=argmax(P(y|x))
来选择概率最高的一个,该向量可以在张量流中写为y_pred = tf.argmax(out_layer, 1)
。
考虑单层网络。您具有形状为X
的输入矩阵[n_samples, x_dimension]
,然后将其乘以形状为W
的某个矩阵[x_dimension, model_output]
。您要说的总和是矩阵X
的行和矩阵W
的列之间的点积。这样,输出将具有形状[n_samples, model_output]
。在此输出上应用激活功能(如果它是最后一层,则可能需要softmax)。也许您所显示的图片有些误导。
从数学上讲,无偏差的层可以描述为,并假设矩阵的第一行(第一行是单个输入数据点)是
W
的第一列是
该点积的结果由
给出这是您的总和。对矩阵W
中的每一列重复此操作,结果是大小为model_output
(与W
中的列数相对应的向量)。向此向量添加偏差(如果需要),然后应用激活。
答案 1 :(得分:1)
tf.matmul运算符执行矩阵乘法,这意味着结果矩阵中的每个元素都是乘积之和(与您所描述的完全一致)。
举一个简单的例子,其中有一个行向量和一个列向量,如果您只有一个神经元和一个输入向量(按照上面共享的图形),就是这种情况;
x = [2,3,1] y = [3, 1, 2]
那么结果将是:
tf.matmul(x,y)= 2 * 3 + 3 * 1 + 1 * 2 = 11
在那里您可以看到加权总和。
p.s:tf.multiply执行逐元素乘法,这不是我们想要的。