python - Keras 二元分类 - Sigmoid 激活函数

标签 python tensorflow neural-network keras sigmoid

我已经在 Keras 中使用 tensorflow 实现了一个基本的 MLP,我正在尝试解决一个二元分类问题。对于二元分类,sigmoid 似乎是推荐的激活函数,我不太明白为什么,以及 Keras 如何处理这个问题。

我知道 sigmoid 函数会产生 0 到 1 之间的值。我的理解是,对于使用 sigmoid 的分类问题,将有一个特定的阈值用于确定输入的类别(通常为 0.5)。在 Keras 中,我没有看到任何指定此阈值的方法,所以我假设它是在后端隐式完成的?如果是这种情况,Keras 如何区分在二元分类问题或回归问题中使用 sigmoid?对于二元分类,我们需要一个二元值,但对于回归,我们需要一个标称值。我所看到的可能表明这是损失函数。这是通知 Keras 如何处理数据吗?

此外,假设 Keras 隐式应用阈值,为什么当我使用我的模型预测新数据时它输出标称值?

例如:

y_pred = model.predict(x_test)
print(y_pred)

给出:

[7.4706882e-02] [8.3481872e-01] [2.9314638e-04] [5.2297767e-03] [2.1608515e-01] ... [4.4894204e-03] [5.1120580e-05] [7.0263929e-04]

我可以在预测得到二进制输出时自己应用一个阈值,但是 Keras 肯定必须这样做才能正确分类吗?也许 Keras 在训练模型时应用了一个阈值,但是当我用它来预测新值时,阈值没有被使用,因为损失函数没有被用于预测?或者根本不应用阈值,而输出的标称值恰好适用于我的模型?我已经检查过二进制分类的 Keras 示例是否发生了这种情况,所以我认为我的代码没有出现任何错误,尤其是因为它预测准确。

如果有人能解释这是如何工作的,我将不胜感激。

这是我的模型作为引用点:

model = Sequential()
model.add(Dense(124, activation='relu', input_shape = (2,)))
model.add(Dropout(0.5))
model.add(Dense(124, activation='relu'))
model.add(Dropout(0.1))
model.add(Dense(1, activation='sigmoid'))
model.summary()

model.compile(loss='binary_crossentropy',
              optimizer=SGD(lr = 0.1, momentum = 0.003),
              metrics=['acc'])

history = model.fit(x_train, y_train,
                    batch_size=batch_size,
                    epochs=epochs,
                    verbose=1,
                    validation_data=(x_test, y_test))
score = model.evaluate(x_test, y_test, verbose=0)

最佳答案

二元分类的输出是样本属于某个类别的概率。

how is Keras distinguishing between the use of sigmoid in a binary classification problem, or a regression problem?

不需要。它使用损失函数计算损失,然后求导数并更新权重。

换句话说:

  • 在训练期间,该框架将损失降至最低。用户必须指定损失函数(由框架提供)或提供他们自己的。网络只关心这个函数输出的标量值,它的 2 个参数是预测的 y^ 和实际的 y
  • 每个激活函数都实现了前向传播和反向传播功能。该框架只对这两个功能感兴趣。它不关心函数到底做了什么,只要梯度下降是可微的即可。

关于python - Keras 二元分类 - Sigmoid 激活函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49135929/

相关文章:

python - Flask + sqlalchemy 证书验证失败 : IP address mismatch

python - 使用 import keras 和 import tensorflow.keras 之间的区别?

python - 构建多个输出的神经网络

neural-network - 我怎样才能得到伯特预训练模型中最后一个变压器编码器的所有输出,而不仅仅是 cls token 输出?

python - 在列表中查找小于或等于键的值

php - 我在 PHP 中使用 Django 用户身份验证。这种基于 cookie 的身份验证方案是否安全?

python - tf.norm 错误 ValueError : 'ord' must be a supported vector norm, 来自

tensorflow - 如何在 Keras 测试期间使用批量标准化?

neural-network - 如何用 MLP 训练乘法器?

Python多处理比单线程慢