Keras 二元分类 - Sigmoid 激活函数
Posted
技术标签:
【中文标题】Keras 二元分类 - Sigmoid 激活函数【英文标题】:Keras Binary Classification - Sigmoid activation function 【发布时间】:2018-08-14 14:40:46 【问题描述】:我已经在 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)
【问题讨论】:
也许是自定义指标? keras.io/metrics/#custom-metrics 【参考方案1】:二元分类的输出是样本属于某个类别的概率。
Keras 如何区分在二元分类问题或回归问题中使用 sigmoid?
不需要。它使用损失函数计算损失,然后是导数并更新权重。
换句话说:
在训练期间,框架将损失降至最低。用户必须指定损失函数(由框架提供)或提供自己的。网络只关心这个函数输出的标量值,它的 2 个参数是预测的y^
和实际的 y
。
每个激活函数都实现了前向传播和反向传播函数。该框架只对这两个功能感兴趣。它不关心函数究竟做了什么。唯一的要求是激活函数是非线性的。
【讨论】:
谢谢!这很有意义。如果它给你一个属于某个类的概率,那么如何计算错误?您会将概率与二进制值进行比较。这行得通吗? @DanielWhettam 对于 tensorflow Keras 后端,请参阅 github.com/tensorflow/tensorflow/blob/… @DanielWhettam 为您添加了更多详细信息。 假设我需要二进制输出。 softmax 层是实现它的好方法吗?【参考方案2】:您可以使用 compile() 显式分配阈值
tf.keras.metrics.BinaryAccuracy(
name="binary_accuracy", dtype=None, threshold=0.5
)
如下:
model.compile(optimizer='sgd',
loss='mse',
metrics=[tf.keras.metrics.BinaryAccuracy()])
【讨论】:
以上是关于Keras 二元分类 - Sigmoid 激活函数的主要内容,如果未能解决你的问题,请参考以下文章