CNN分类中验证损失减少,验证准确率下降

Posted

技术标签:

【中文标题】CNN分类中验证损失减少,验证准确率下降【英文标题】:Validaton loss decrease and validation accuracy decrease in CNN classification 【发布时间】:2019-11-24 23:42:06 【问题描述】:

我在 2 个类别上训练分类(产卵的鱼或不是来自比例图像)。数据集不平衡。生成的鳞片只有 5%。

我没有检查每个训练/验证/测试集中有多少产卵鱼,但有 9073 张图像。拆分为 70/15/15 %。然后我在 epoke 2 中观察到 val_loss 减少而 val_acc 减少。这怎么可能?

我正在使用 Keras。该网络是来自 github.com/qubvel 的 EfficientNetB4。

1600/1600 [==============================] - 1557s 973ms/step - loss: 1.3353 - acc: 0.6474 - val_loss: 0.8055 - val_acc: 0.7046

Epoch 00001: val_loss improved from inf to 0.80548, saving model to ./checkpoints_missing_loss2/salmon_scale_inception.001-0.81.hdf5
Epoch 2/150
1600/1600 [==============================] - 1508s 943ms/step - loss: 0.8013 - acc: 0.7084 - val_loss: 0.6816 - val_acc: 0.6973

Epoch 00002: val_loss improved from 0.80548 to 0.68164, saving model to ./checkpoints_missing_loss2/salmon_scale_inception.002-0.68.hdf5

编辑:这是另一个示例 - 只有 1010 张图像,但其平衡 - 50/50。

Epoch 5/150
1600/1600 [==============================] - 1562s 976ms/step - loss: 0.0219 - acc: 0.9933 - val_loss: 0.2639 - val_acc: 0.9605

Epoch 00005: val_loss improved from 0.28715 to 0.26390, saving model to ./checkpoints_missing_loss2/salmon_scale_inception.005-0.26.hdf5
Epoch 6/150
1600/1600 [==============================] - 1565s 978ms/step - loss: 0.0059 - acc: 0.9982 - val_loss: 0.4140 - val_acc: 0.9276

Epoch 00006: val_loss did not improve from 0.26390
Epoch 7/150
1600/1600 [==============================] - 1561s 976ms/step - loss: 0.0180 - acc: 0.9941 - val_loss: 0.2379 - val_acc: 0.9276

和 val_loss 以及 val_acc 减少。

【问题讨论】:

【参考方案1】:

如果你有这样一个不平衡的数据集,模型首先将所有的东西都归为多数类,得到相对较高的准确率,但所有的概率都分配给了多数类。原因是因为反向传播路径很短,所以最终的bias可以很快被学习到。

在训练的后期,模型基本上找到了不将输入与多数类进行分类的理由。此时模型开始出错,准确率下降,但概率分布更均匀,因此从损失的角度来看,误差更小。

对于这样一个不平衡的数据集,我宁愿跟踪 F-measure 而不是准确率。

【讨论】:

是的,我在测试集上计算 Precsision、recall 和 F1,但 keras 中没有 F 度量 - 所以准确度很方便。 问题被否决了,但我发现了另一个例子,其中数据集是平衡的 - 但很小 - 其中 val_loss 和 val_acc 减少。

以上是关于CNN分类中验证损失减少,验证准确率下降的主要内容,如果未能解决你的问题,请参考以下文章

Tensorflow:损失减少,但准确度稳定

验证损失不断减少,而训练损失在 3 个 epoch 后开始增加

训练准确性提高但验证准确性保持不变

验证损失在 3 个 epoch 后增加,但验证准确度不断增加

如何解释损失和准确性的增加

为啥在第 35 个 epoch 之后训练和验证的准确率会随着小幅度的下降而上升?