我已经在Keras中使用tensorflow实现了基本的MLP,并且正在尝试解决二进制分类问题。对于二进制分类,似乎建议使用Sigmoid激活函数,但我不太了解为什么以及Keras如何处理它。
我知道S形函数会产生介于0和1之间的值。我的理解是,对于使用S形的分类问题,将使用某个阈值来确定输入的类别(通常为0.5)。在Keras中,我看不到任何指定此阈值的方法,因此我假设它是在后端隐式完成的?如果是这样的话,Keras在二进制分类问题或回归问题中如何区分使用乙状结肠?对于二进制分类,我们需要一个二进制值,但是对于回归,则需要一个标称值。我所看到的可能表明这是损失函数。这是否使Keras知道如何处理数据?
另外,假设Keras隐式应用阈值,为什么当我使用模型对新数据进行预测时,为什么它会输出标称值?
例如:
y_pred = model.predict(x_test)
print(y_pred)
Run Code Online (Sandbox Code Playgroud)
给出:
[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)
Run Code Online (Sandbox Code Playgroud)