gpt4 book ai didi

machine-learning - 为什么对于同一问题,binary_crossentropy 和 categorical_crossentropy 给出不同的性能?

转载 作者:行者123 更新时间:2023-11-30 08:19:32 24 4
gpt4 key购买 nike

我正在尝试训练 CNN 按主题对文本进行分类。当我使用二元交叉熵时,我获得了约 80% 的准确度,而使用分类交叉熵时,我获得了约 50% 的准确度。

我不明白这是为什么。这是一个多类问题,这是否意味着我必须使用分类交叉熵并且二元交叉熵的结果毫无意义?

model.add(embedding_layer)
model.add(Dropout(0.25))
# convolution layers
model.add(Conv1D(nb_filter=32,
filter_length=4,
border_mode='valid',
activation='relu'))
model.add(MaxPooling1D(pool_length=2))
# dense layers
model.add(Flatten())
model.add(Dense(256))
model.add(Dropout(0.25))
model.add(Activation('relu'))
# output layer
model.add(Dense(len(class_id_index)))
model.add(Activation('softmax'))

然后我使用 categorical_crossentropy 作为损失函数来编译它:

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

直观上来说,为什么我想使用分类交叉熵是有道理的,我不明白为什么我用二进制得到了好的结果,而用分类得到了糟糕的结果。

最佳答案

用户 xtof54 已经在 his answer below 中报告了分类交叉熵和二元交叉熵之间明显的性能差异的原因。 ,即:

the accuracy computed with the Keras method evaluate is just plainwrong when using binary_crossentropy with more than 2 labels

我想对此进行更详细的阐述,展示实际的根本问题,进行解释,并提供补救措施。

此行为不是错误;而是错误。根本原因是一个相当微妙且未记录的问题,即当您仅包含 metrics=['accuracy'] 时,Keras 如何根据您选择的损失函数实际猜测使用哪种精度 在你的模型编译中。换句话说,当你的第一个编译选项

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

有效,您的第二个:

model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

不会产生您期望的结果,但原因不是使用二元交叉熵(至少在原则上,它是一个绝对有效的损失函数)。

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

让我们使用 MNIST CNN example 来验证情况是否如此。在 Keras 中,进行以下修改:

model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])  # WRONG way

model.fit(x_train, y_train,
batch_size=batch_size,
epochs=2, # only 2 epochs, for demonstration purposes
verbose=1,
validation_data=(x_test, y_test))

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

# 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.98780000000000001

score[1]==acc
# False

为了解决这个问题,即使用二元交叉熵作为损失函数(正如我所说,这没有什么问题,至少在原则上),同时仍然获得问题所需的分类准确性目前,您应该在模型编译中明确询问categorical_accuracy,如下所示:

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

在 MNIST 示例中,按照上面所示对测试集进行训练、评分和预测后,现在的两个指标是相同的:

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

# Actual accuracy calculated manually:
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.98580000000000001

score[1]==acc
# True

系统设置:

Python version 3.5.3
Tensorflow version 1.2.1
Keras version 2.0.4

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

关于machine-learning - 为什么对于同一问题,binary_crossentropy 和 categorical_crossentropy 给出不同的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42081257/

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