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

Posted

技术标签:

【中文标题】Tensorflow:损失减少,但准确度稳定【英文标题】:Tensorflow: loss decreasing, but accuracy stable 【发布时间】:2017-09-15 21:18:43 【问题描述】:

我的团队正在 Tensorflow 中训练一个 CNN,用于对损坏/可接受的部分进行二元分类。我们通过修改 cifar10 示例代码创建了我们的代码。在我之前使用神经网络的经验中,我总是训练到损失非常接近 0(远低于 1)。但是,我们现在正在训练期间(在单独的 GPU 上)使用验证集评估我们的模型,似乎精度在大约 6.7k 步后停止增加,而在超过 40k 步后损失仍在稳步下降。这是因为过度拟合吗?一旦损失非常接近于零,我们是否应该期望看到准确性再次飙升?当前的最大精度是不可接受的。我们应该杀死它并继续调整吗?你有什么建议吗?这是我们修改后的代码和训练过程的图表。

https://gist.github.com/justineyster/6226535a8ee3f567e759c2ff2ae3776b

Precision and Loss Images

【问题讨论】:

【参考方案1】:

二元交叉熵损失的减少并不意味着准确性的提高。考虑标签 1,在时间步长 1、2、3 和分类阈值 0.5 处的预测 0.2、0.4 和 0.6。时间步长 1 和 2 会减少损失,但不会增加准确度。

通过过度拟合训练数据来确保您的模型有足够的容量。如果模型对训练数据过度拟合,请使用 dropout、L1 和 L2 正则化以及数据增强等正则化技术避免过度拟合。

最后,确认您的验证数据和训练数据来自同一个分布。

【讨论】:

在尝试在全黑图像上找到 NN 后得出您的答案,包括 3 个类。分类器学习使所有类 LOL 的概率为 33%。所以损失从7减少到1,但准确率保持在33%!【参考方案2】:

这是我的建议,可能的问题之一是您的网络开始记忆数据,是的,您应该增加正则化,

更新: 在这里,我想再提一个可能导致此问题的问题: 验证集中的平衡比率与训练集中的平衡比率相去甚远。我建议,首先尝试了解您的测试数据(真实世界的数据,您的模型在推理时将面临的数据)的描述性外观,它的平衡比率是多少,以及其他类似特征。然后尝试使用几乎与真实数据相同的描述来构建这样的训练/验证集。

【讨论】:

您认为添加更多层或丢弃层会有所帮助吗? 先应用 dropout 层,如果没有意义,然后添加更多层和更多 dropout。还可以尝试减小过滤器大小并增加通道。 我们的图片只有一个通道(黑白)。你能解释更多关于增加渠道的信息吗?您还认为更改过滤器的数量也会提高准确性吗?目前是 256 个。 网络参数中的每一个配置都是通过尝试和错误来实现的,没有人能说改变过滤器或层或任何东西可以改善你的结果,你应该尝试所有可能的方法来达到你的目标准确性,跨度> 【参考方案3】:

嗯,当我在最后一层使用Softmax 函数而不是Sigmoid 进行二元分类时,我遇到了类似的情况。

我的验证损失和训练损失正在减少,但两者的准确性保持不变。所以这给了我一个教训,为什么sigmoid 用于二进制分类。

【讨论】:

以上是关于Tensorflow:损失减少,但准确度稳定的主要内容,如果未能解决你的问题,请参考以下文章

火车损失正在减少,但准确度保持不变

神经网络 - Softmax 交叉熵损失减少对应于准确性降低

为啥损失减少但准确性也降低(Pytorch,LSTM)?

为啥损失减少而准确率却没有增加? PyTorch

为啥尽管损失衰减且评估结果合理,但张量流的“准确度”值始终为 0

损失函数正在减少,但度量函数保持不变?