使用 Tensorflow 训练神经网络时避免过度拟合

Posted

技术标签:

【中文标题】使用 Tensorflow 训练神经网络时避免过度拟合【英文标题】:Avoiding overfitting while training a neural network with Tensorflow 【发布时间】:2019-01-29 21:48:15 【问题描述】:

我正在使用 Tensorflow 的对象检测 API 训练神经网络来检测汽车。我使用以下 youtube 视频来学习和执行该过程。

https://www.youtube.com/watch?v=srPndLNMMpk&t=65s

他的系列的第 1 至 6 部分。

现在在他的视频中,他提到当损失值平均达到 ~1 或以下时停止训练,并且大约需要 10000'ish' 步。

在我的例子中,现在是 7500 步,损失值在 0.6 到 1.3 之间不断波动。

很多人在评论部分抱怨这个系列的误报,但我认为这是因为不必要的长时间训练过程(因为他们不知道何时停止?)导致过度拟合!

我想避免这个问题。我希望在避免错误检测或过度拟合的同时拥有最佳权重而不是最佳权重。我也在观察 Tensorboard 的“总损失”部分。它在 0.8 到 1.2 之间波动。我什么时候停止训练过程?

我也想大致了解一下,“停止训练”取决于哪些因素?它总是关于平均损失 1 或更少吗?

附加信息: 我的训练数据有大约 300 张图像 测试数据~20张图片

由于我使用的是迁移学习的概念,所以我选择了 ssd_mobilenet_v1.model。

Tensorflow 1.9 版(在 CPU 上) Python 3.6 版

谢谢!

【问题讨论】:

【参考方案1】:

您应该使用不同于训练集和测试集的验证测试。

在每个 epoch,您都会计算训练集和验证集的损失。 如果验证损失开始增加,请停止训练。您现在可以在测试集上测试您的模型。

验证集大小通常与测试集大小相同。例如,训练集占 70%,验证集和测试集各占 15%。

另外,请注意,您的数据集中有 300 张图像似乎还不够。你应该增加它。

对于您的其他问题: 损失是您的错误的总和,因此取决于问题和您的数据。在这方面,损失 1 并没有多大意义。永远不要依赖它来停止你的训练。

【讨论】:

谢谢!我对神经网络和 Tensorflow 很陌生,由于我正在学习他的教程并且训练正在进行并且几乎即将结束,我想知道我应该在哪个损失值处停止训练过程?对于我的下一次培训,我一定会听从您的建议并创建一个验证测试/集。另外,在 Tensorboard 中,“正则化损失”图正在下降,是否正常? @Winbuntu 我编辑了我的答案,我也回答了你的第二个问题。是的,正则化损失减少是正常的。见:***.com/questions/48443886/…一般来说,loss是指模型对一组数据造成的误差,所以你要减少它。

以上是关于使用 Tensorflow 训练神经网络时避免过度拟合的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Tensorflow 的训练之间进行评估

TensorFlow基础 —— 模型的保存读取与可视化方法总结

何时停止训练神经网络?

TensorFlow 对象检测 API 过拟合

为啥我们使用正则化来训练神经网络?

训练和验证模式 tensorflow 的 SAME 数据丢失不一致