Python Keras二元分类-Sigmoid激活函数
我已经用tensorflow在Keras中实现了一个基本的MLP,我正在尝试解决一个二进制分类问题。对于二进制分类,似乎sigmoid是推荐的激活函数,我不太理解为什么,以及Keras如何处理这个问题 我知道sigmoid函数将生成0到1之间的值。我的理解是,对于使用sigmoid的分类问题,将有一个特定的阈值用于确定输入的类别(通常为0.5)。在Keras中,我没有看到任何指定此阈值的方法,所以我假设它是在后端隐式完成的?如果是这种情况,Keras如何区分在二元分类问题中使用sigmoid,还是在回归问题中使用sigmoid?对于二元分类,我们需要一个二元值,但是对于回归,需要一个标称值。我所能看到的,可能表明这是损失函数。这是否告知Keras如何处理数据 此外,假设Keras隐含地应用了一个阈值,当我使用我的模型预测新数据时,为什么它会输出标称值 例如:Python Keras二元分类-Sigmoid激活函数,python,tensorflow,neural-network,keras,sigmoid,Python,Tensorflow,Neural Network,Keras,Sigmoid,我已经用tensorflow在Keras中实现了一个基本的MLP,我正在尝试解决一个二进制分类问题。对于二进制分类,似乎sigmoid是推荐的激活函数,我不太理解为什么,以及Keras如何处理这个问题 我知道sigmoid函数将生成0到1之间的值。我的理解是,对于使用sigmoid的分类问题,将有一个特定的阈值用于确定输入的类别(通常为0.5)。在Keras中,我没有看到任何指定此阈值的方法,所以我假设它是在后端隐式完成的?如果是这种情况,Keras如何区分在二元分类问题中使用sigmoid,还
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如何区分在二元分类问题或回归问题中使用sigmoid 它不需要这样做。它使用损失函数计算损失,然后计算导数并更新权重 换言之:
- 在培训期间,该框架将损失降至最低。用户必须指定损失函数(由框架提供)或提供自己的损失函数。网络只关心此函数输出的标量值,它的两个参数是预测的
和实际的y^
y
- 每个激活函数实现正向传播和反向传播函数。该框架只对这两个功能感兴趣。它不关心函数的确切功能。唯一的要求是激活函数是非线性的
model.compile(optimizer='sgd',
loss='mse',
metrics=[tf.keras.metrics.BinaryAccuracy()])
也许是定制的度量标准?非常感谢。这很有道理。如果它给你一个属于某个类的概率,那么如何计算误差呢?你可以将概率与二进制值进行比较。这有用吗?@DanielWhettam For tensorflow Keras后端请参阅@DanielWhettam为您添加了更多详细信息。假设我需要二进制输出。softmax图层是一种很好的方法吗?
model.compile(optimizer='sgd',
loss='mse',
metrics=[tf.keras.metrics.BinaryAccuracy()])