【发布时间】:2018-11-14 23:07:41
【问题描述】:
我正在使用 Tensorflow 中实现的卷积神经网络 (cnn) 进行图像分割。我有两个类,我使用交叉熵作为损失函数和 Adam 优化器。 我正在用大约 150 张图像训练网络。
在训练期间,我看到了这种周期性模式,训练损失会下降,直到达到几个高值,然后迅速下降到之前的水平。
在验证损失中也可以观察到类似的模式,验证损失会在几个时期内周期性下降,然后又回到之前的水平。
通过降低学习率,这种模式不再可见,但损失会更高,并且 Interception over Union(IoU) 会低得多。
编辑:我发现我有两次带有两个不同标签的图像。我还注意到这种模式与 drop_out 有关,在训练图像被学习到 100% 之后,drop_out 会导致在某些迭代中训练误差增加很多,这会导致峰值。有人遇到过这样的辍学经历吗?
有人见过这样的模式吗?这可能是什么原因?
【问题讨论】:
-
您是否正确打乱了您的训练数据?如果数据没有被打乱,可能会发生这样的事情:你的模型只会看到某个类的输入并习惯这些输入(变得更好,减少损失),并且在某个点训练到达数据中它切换到的点另一个类,这将大大降低性能(因为此时模型偏向于另一个类)。
-
是的,我使用
random.shuffle对数据进行洗牌,我可以尝试更改随机种子,看看是否会改变一些东西。我每批有两张图像,当一个时期结束时,我已经用我所有的训练图像进行了训练。我认为问题可能出在一张特定的图像上,但网络可以看到每个时期的所有图像。 -
我找到了答案,我的数据集中有一张重复的图像,标签略有不同,因此数据集不一致,无法完美地学习数据集。更改此设置后,仍有一些明显的周期性峰值,但仅在前 200 个时期。
标签: python tensorflow loss-function cross-entropy dropout