使用fit_generator在Keras中进行训练时,验证损失值过于嘈杂

4
任何关于为什么我们的训练损失平滑而验证损失嘈杂(请参见链接)跨越时期的想法吗?我们正在使用由这个Kaggle竞赛提供的眼底照片数据集实现糖尿病视网膜病变(二元分类)的深度学习模型。我们使用带有TensorFlow后端的Keras 2.0。由于数据集太大无法放入内存,因此我们使用fit_generator,并使用ImageDataGenerator从训练和验证文件夹中随机获取图像:
# TRAIN THE MODEL
model.fit_generator(
    train_generator,
    steps_per_epoch= train_generator.samples // training_batch_size,
    epochs=int(config['training']['epochs']),
    validation_data=validation_generator,
    validation_steps= validation_generator.samples // validation_batch_size,
    class_weight=None)

我们的CNN架构是VGG16,最后两个完全连接层的dropout = 0.5,仅在第一个完全连接层之前进行批量归一化,并进行数据增强(包括水平和垂直翻转图像)。我们的训练和验证样本使用训练集均值和标准偏差进行归一化。批量大小为32。我们的激活函数是sigmoid,损失函数是binary_crossentropy。 您可以在Github上找到我们的实现 这绝对与过拟合无关,因为我们尝试了高度规则化的模型,行为非常相似。它是否与从验证集中进行采样有关?你们之中有人以前遇到过类似的问题吗?
谢谢!

你选择的训练/测试比例是多少?也就是说,你有多少训练和测试数据?此外,当你尝试多次训练时,是否会出现这种嘈杂的验证损失?如果你提供在这里使用的所有参数(每个epoch的步骤、epochs等),那将会很有帮助。 - DarkCygnus
训练样本数量约为32,000个,其中大约20%为正样本,80%为负样本。在3000个验证样本中,我有完全相同的分布。我使用不同的正则化策略(dropout、权重衰减、批量归一化、数据增强等)训练了模型,但总是得到相同的嘈杂验证损失。每个epoch的步骤数等于训练样本数除以批处理大小(大约100个步骤)。 - user2227561
1
你有没有找到任何有用的东西?@user2227561 - Abhishek Singh
1个回答

0

我会按照以下顺序进行查找:

  • 验证生成器实现中的错误(包括步骤 - 是否遍历了所有为验证保留的图片?)
  • 在验证生成器中不要使用数据增强(原因:增强可能是不好的,无法学习的,并且在训练时,它只通过硬编码关系来获得良好的分数,这些关系是不能泛化的)
  • 将训练/验证划分改为50/50
  • 通过自定义回调函数,在每个epoch结束时计算验证损失(使用相同的函数,但通过回调函数调用会产生不同(在某些非标准模型上更准确)的结果)

如果以上任何方法都不能使验证损失曲线更平滑,那么我的下一个假设就是这就是它的样子,我可能需要在模型架构上进行调整。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接