python - 即使 keras 中的精度为 1.00,categorical_crossentropy 也会返回较小的损失值

标签 python machine-learning deep-learning keras cross-entropy

我有一个专为多分类问题设计的 LSTM 模型。训练时,准确率实际上是 1.00。但仍然返回小的损失值。这是什么意思?所有目标都被正确预测。为什么损失值不能为零?

adadelta = Adadelta(clipnorm=1.)
model.compile(optimizer=adadelta,
              loss='categorical_crossentropy',
              sample_weight_mode='temporal',
              metrics=['accuracy'])

损失值如下。

Epoch 12/12
1000/1000 [==============================] - 38s - loss: 1.2053e-04 - acc: 1.0000    

最佳答案

网络正在优化损失。在您的情况下,损失是分类交叉熵。分类衡量正确概率的对数值。

网络预测的一个样本 y_pred 是这样的,y_true 是真正的目标值:y_true 是二进制的,因为你想要预测它是否属于某个类别,y_pred 是一个介于 0 和 1 之间的 float ,您可以将其解释为属于该类别的概率。

一个样本的公式是:

loss_sample = y_true * ln(y_pred) + (1-y_true) * ln(1-y_pred)

因此,如果 y_true 为 1(样本属于该类),则 loss_sample = ln(y_pred) 并且如果 y_true 为 0 ,然后是 loss_sample = ln(1-y_pred)。这是有道理的,因为如果 y_true 为 1,您希望损失尽可能小,因此您希望 y_pred 为 1。如果 y_true 为 0,如果 1-y_pred 接近 1,你的损失会减少,所以如果 y_pred 为 0。

至于准确度,如果所有样本属于正确类别的概率高于 0.5 阈值,则准确度等于 1。

这意味着如果您有一个包含 3 个样本和目标的训练集 y1 = 1y2 = 0y3 = 1 和您预测 y1_hat = 0.6y2_hat = 0.2y3_hat = 0.9。那么你的准确度将是 100%,但你的损失将是 loss = ln(0.6) + ln(1-0.2) + ln(0.9),它不是零。

总结:您预测属于某个类别的概率,损失计算正确的置信度,而准确性只是根据预测做出决定,而不考虑置信度。

您可以获得完美的准确度分数,因为您的网络做出了正确的决定,但是您的损失是积极的,因为您的网络对结果并不完全有信心。

是不是更清楚了?

关于python - 即使 keras 中的精度为 1.00,categorical_crossentropy 也会返回较小的损失值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43025416/

相关文章:

python - 输入 0 与层 flatten_2 不兼容 : expected min_ndim=3, 发现 ndim=2

python - 我需要在 Kfold 循环中重置模型权重吗?

python - 使用 Python 从 Excel 到 PowerPoint 的图表

concurrency - 如何使用 Flask 和 Gunicorn 获得 1000 个请求的并发

python - 加载一个非常大的文本文件并进行转置

python - 如何在 Keras 中创建返回多维值的指标?

python - 将 numpy ndarray 数据放入 pandas

python - 在 Python 中获取服务器/服务器名称指示

c++ - Python 列表等同于 C++?

python - 绘制多维特征的散点图