machine-learning - 深度神经网络模型在一个 epoch 后停止学习
问题描述
我正在训练一个无监督的 NN 模型,由于某种原因,恰好在一个 epoch(80 步)之后,模型停止学习。 ] 你知道它为什么会发生吗?我应该怎么做才能防止它发生?
这是关于我的 NN 的更多信息:我有一个试图解决优化问题的深度 NN。我的损失函数是定制的,它是我在优化问题中的目标函数。所以如果我的优化问题是min f(x) ==> loss
,现在在我的 DNNloss = f(x)
中。我有 64 个输入,64 个输出,中间有 3 层:
self.l1 = nn.Linear(input_size, hidden_size)
self.relu1 = nn.LeakyReLU()
self.BN1 = nn.BatchNorm1d(hidden_size)
最后一层是:
self.l5 = nn.Linear(hidden_size, output_size)
self.tan5 = nn.Tanh()
self.BN5 = nn.BatchNorm1d(output_size)
扩展我的网络。有了更多的层和节点(双打:每 200 个节点 8 层),我可以在降低误差方面取得更多进展,但在 100 步之后训练误差再次变平!
解决方案
症状是训练损失相对较早地停止改善。假设您的问题完全可以学习,那么这种行为的原因有很多。以下是最相关的:
- 输入预处理不当:神经网络更喜欢零均值的输入。例如,如果输入都是正数,它将限制权重在同一方向上更新,这可能是不可取的(https://youtu.be/gYpoJMlgyXA)。
因此,您可能希望从所有图像中减去平均值(例如,从 3 个通道中的每个通道中减去 127.5)。缩放以使每个通道中的单位标准偏差也可能会有所帮助。
网络的泛化能力:网络对于任务来说不够复杂或深度不够。
这很容易检查。你可以只用几张图片(比如 3 到 10 张)训练网络。网络应该能够过拟合数据并将损失驱动到几乎为 0。如果不是这种情况,您可能必须添加更多层,例如使用超过 1 个 Dense 层。
另一个好主意是使用预训练的权重(在 Keras 文档的应用程序中)。您可以调整顶部的密集层以适应您的问题。
权重初始化不当。不正确的权重初始化会阻止网络收敛(https://youtu.be/gYpoJMlgyXA,与之前相同的视频)。
对于 ReLU 激活,您可能希望使用 He 初始化而不是默认的 Glorot 初始化。我发现有时这可能是必要的,但并非总是如此。
最后,您可以使用 Keras 的调试工具,例如 keras-vis、keplr-io、deep-viz-keras。它们对于打开卷积网络的黑盒非常有用。
我遇到了同样的问题,然后我遵循了以下方法:在浏览了一篇博客文章后,我设法确定我的问题是由我的标签编码引起的。最初我将它们作为单热编码,看起来像 [[0, 1], [1, 0], [1, 0]],在博客文章中它们的格式为 [0 1 0 0 1]。将我的标签更改为此并使用二元交叉熵使我的模型正常工作。感谢 Ngoc Anh Huynh 和 rafaelvalle!
推荐阅读
- sed - 替换单词,但只能在冒号之后
- html - 如何将 ngx modal 设置为屏幕中间?
- javascript - javascript没有以某种方式运行
- javascript - 如果代理使用 Live Chat Inc 离线,则隐藏 div
- typescript - 如何在 .map 中定义解构参数的类型
- google-sheets - Google 电子表格中的 INNER JOIN
- python - 与 python 一起使用时,Google Bigquery 第一次调用太慢了
- reactjs - React Table 错误并且没有 CSS 文件
- apache - 如果域配置了另一个 apache 端口到 xampp,HTTPS 不起作用
- python - Tensorflow CIELAB 颜色空间边界