Keras二元分类.乙状结肠激活函数

2024-04-29 06:29:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我用tensorflow在Keras中实现了一个基本的MLP,并试图解决一个二进制分类问题。对于二元分类,似乎乙状结肠是推荐的激活函数,我不太明白为什么,以及凯拉斯是如何处理这个问题的。

我知道sigmoid函数将产生0到1之间的值。我的理解是,对于使用乙状结肠的分类问题,将有一个特定的阈值用于确定输入的类别(通常为0.5)。在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)

Tags: 函数模型testaddmodel二进制分类情况
1条回答
网友
1楼 · 发布于 2024-04-29 06:29:46

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

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

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

换句话说:

  • 在训练过程中,框架将损失最小化。用户必须指定损失函数(由框架提供)或提供自己的损失函数。网络只关心这个函数输出的标量值,它的两个参数是预测的y^和实际的y
  • 每个激活函数实现正向传播和反向传播函数。框架只对这两个功能感兴趣。它并不关心函数的具体功能。唯一的要求是激活函数是非线性的。

相关问题 更多 >