【发布时间】:2018-05-29 04:57:38
【问题描述】:
我正在训练这个问题底部链接的 Keras 对象检测模型,尽管我相信我的问题与 Keras 和我正在尝试训练的特定模型 (SSD) 无关,而是与在训练期间将数据传递给模型的方式。
这是我的问题(见下图): 我的训练损失总体上正在减少,但它显示出明显的规律性峰值:
x 轴上的单位不是训练 epoch,而是几十个训练步骤。峰值每 1390 个训练步骤精确出现一次,这正是我的训练数据集一次完整通过的训练步骤数。
每次完全通过训练数据集后总是会出现尖峰,这让我怀疑问题不在于模型本身,而在于训练期间输入的数据。
我在训练期间使用batch generator provided in the repository 生成批次。我检查了生成器的源代码,它确实在每次通过之前使用sklearn.utils.shuffle 对训练数据集进行了洗牌。
我很困惑有两个原因:
- 训练数据集在每次通过前都会被洗牌。
- 正如您在 this Jupyter notebook 中看到的那样,我正在使用生成器的 ad-hoc 数据增强功能,因此理论上任何传递的数据集都不应相同:所有增强都是随机的。
我做了一些测试预测,看看模型是否真的在学习任何东西,而且确实如此!随着时间的推移,预测会变得更好,但当然模型的学习速度非常慢,因为这些尖峰似乎每 1390 步就会扰乱梯度。
非常感谢任何关于这可能是什么的提示!我使用与上面链接的完全相同的 Jupyter 笔记本进行培训,我更改的唯一变量是从 32 到 16 的批量大小。除此之外,链接的笔记本包含我正在遵循的确切培训过程。
这是包含模型的存储库的链接:
【问题讨论】:
-
这不是minimal reproducible example,我认为这个问题可以很好地控制饮食,这将增加得到答案的可能性:)
-
@djk47463 我同意这不是一个紧凑的示例,但是如果您有一个复杂的对象检测模型并且问题可能出在模型的任何部分,您如何创建一个紧凑的示例?无论如何,我自己已经解决了,毕竟这是一个特定于 Keras 的问题。也许这在某些时候对某人有用。
标签: deep-learning keras