为什么这个TensorFlow示例在激活函数之前没有求和?

时间:2019-03-28 14:25:22

标签: python tensorflow machine-learning

我正在尝试了解TensorFlow代码段。我被教导的是,我们将所有传入的输入求和,然后将它们传递给激活函数。下图显示了单个神经元。注意,我们计算输入的加权和,然后计算激活。

picture

在多层感知器的大多数示例中,它们不包括求和步骤。我觉得这很令人困惑。

以下是其中一个片段的示例:

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。求和在哪里发生?看来我们已经跳过了!

任何帮助都将非常棒!

2 个答案:

答案 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)。也许您所显示的图片有些误导。

从数学上讲,无偏差的层可以描述为enter image description here,并假设矩阵enter image description here的第一行(第一行是单个输入数据点)是

enter image description here

W的第一列是

enter image description here

该点积的结果由

给出

enter image description here

这是您的总和。对矩阵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执行逐元素乘法,这不是我们想要的。