gpt4 book ai didi

machine-learning - 为什么 Keras 中的多类分类时,binary_crossentropy 比 categorical_crossentropy 更准确?

转载 作者:行者123 更新时间:2023-11-30 08:22:07 25 4
gpt4 key购买 nike

我正在学习如何使用 Keras 创建卷积神经网络。我正在尝试获得 MNIST 数据集的高精度。

显然categorical_crossentropy适用于2个以上的类,binary_crossentropy适用于2个类。由于有 10 位数字,我应该使用 categorical_crossentropy。然而,在训练和测试数十个模型之后,binary_crossentropy 始终显着优于 categorical_crossentropy

在 Kaggle 上,我使用 binary_crossentropy 和 10 个时期获得了 99% 以上的准确率。与此同时,使用categorical_crossentropy,我无法获得超过 97% 的结果,即使使用 30 个 epoch(这并不多,但我没有 GPU,所以训练需要很长时间)。

这是我的模型现在的样子:

model = Sequential()
model.add(Convolution2D(100, 5, 5, border_mode='valid', input_shape=(28, 28, 1), init='glorot_uniform', activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Convolution2D(100, 3, 3, init='glorot_uniform', activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.3))
model.add(Flatten())
model.add(Dense(100, init='glorot_uniform', activation='relu'))
model.add(Dropout(0.3))
model.add(Dense(100, init='glorot_uniform', activation='relu'))
model.add(Dropout(0.3))
model.add(Dense(10, init='glorot_uniform', activation='softmax'))
model.compile(loss='binary_crossentropy', optimizer='adamax', metrics=['accuracy'])

最佳答案

简短回答:不是

要看到这一点,只需尝试“手动”计算准确度,您就会发现它与 Keras 使用 model.evaluate 方法报告的准确度不同:

# Keras reported accuracy:
score = model.evaluate(x_test, y_test, verbose=0)
score[1]
# 0.99794011611938471

# Actual accuracy calculated manually:
import numpy as np
y_pred = model.predict(x_test)
acc = sum([np.argmax(y_test[i])==np.argmax(y_pred[i]) for i in range(10000)])/10000
acc
# 0.98999999999999999

看起来如此的原因是一个相当微妙的问题,即 Keras 如何实际猜测使用哪种精度,具体取决于您选择的损失函数,当您在模型编译中仅包含 metrics=['accuracy']

如果您检查 source code ,Keras 没有定义单一的准确度指标,而是定义了几个不同的指标,其中包括 binary_accuracycategorical_accuracy。会发生什么under the hood是这样的,由于您选择了二元交叉熵作为损失函数并且没有指定特定的准确度指标,Keras(错误地...)推断您对 binary_accuracy 感兴趣,这就是它返回。

为了避免这种情况,即使用二元交叉熵作为损失函数(原则上这没有问题),同时仍然获得当前问题所需的分类准确性(即 MNIST 分类) ),您应该在模型编译中明确询问categorical_accuracy,如下所示:

from keras.metrics import categorical_accuracy
model.compile(loss='binary_crossentropy', optimizer='adamax', metrics=[categorical_accuracy])

在训练、评分和预测测试集(如上面所示)之后,这两个指标现在是相同的,因为它们应该是:

sum([np.argmax(y_test[i])==np.argmax(y_pred[i]) for i in range(10000)])/10000 == score[1]
# True

(HT 到 this great answer 到一个类似的问题,这帮助我理解了这个问题......)

更新:在我发帖后,我发现这个问题已经在 this answer 中被识别出来。 .

关于machine-learning - 为什么 Keras 中的多类分类时,binary_crossentropy 比 categorical_crossentropy 更准确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41327601/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com