【问题标题】:Why does this TensorFlow example not have a summation before the activation function?为什么这个 TensorFlow 示例在激活函数之前没有求和?
【发布时间】:2019-03-28 23:50:20
【问题描述】:

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

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

这是其中一个 sn-ps 的示例:

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

任何帮助都会非常棒!

【问题讨论】:

  • 据我了解是softmax做的,相当于softmax = tf.exp(logits) / tf.reduce_sum(tf.exp(logits), axis)
  • 好的——softmax 层可以做到。但是其他节点不做呢?
  • 不,我不这么认为,因为这没有任何意义,如果您求和或执行任何类型的聚合,它们将不再成为一个层,因此您无法将它们提供给另一个层跨度>
  • 它仍然是一个层。层中的每个单独的神经元都接受输入,每个神经元必须产生一个标量值。

标签: python tensorflow machine-learning


【解决方案1】:

模型的最后一层out_layer 输出每个类Prob(y=yi|X) 的概率,形状为[batch_size, n_classes]。要计算这些概率,softmax 功能被应用。对于模型接收到的每个单个输入数据点x,它会输出一个概率向量y,其大小为类别数。然后通过在输出向量class=argmax(P(y|x)) 上应用argmax 来选择概率最高的那个,这可以在tensorflow 中写为y_pred = tf.argmax(out_layer, 1)

考虑具有单层的网络。您有形状为[n_samples, x_dimension] 的输入矩阵X,然后将其乘以形状为[x_dimension, model_output] 的某个矩阵W。您所说的求和是矩阵X 的行和矩阵W 的列之间的点积。然后输出将具有形状[n_samples, model_output]。在这个输出上,你应用激活函数(如果它是你可能想要 softmax 的最后一层)。也许您展示的图片有点误导。

在数学上,没有偏差的层可以描述为,假设矩阵的第一行(第一行是单个输入数据点)是

W 的第一列是

这个点积的结果由下式给出

这是你的总结。您对矩阵W 中的每一列重复此操作,结果是大小为model_output 的向量(对应于W 中的列数)。向这个向量添加偏差(如果需要),然后应用激活。

【讨论】:

  • 我更新了问题以使用网络末端的relu激活功能。我认为激活函数是什么并不重要。
【解决方案2】:

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 执行元素乘法,这不是我们想要的。

【讨论】:

    猜你喜欢
    • 2020-10-11
    • 1970-01-01
    • 2014-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    • 2021-07-10
    相关资源
    最近更新 更多