使用 fit_generator 时 Keras 中的嘈杂验证损失

Posted

技术标签:

【中文标题】使用 fit_generator 时 Keras 中的嘈杂验证损失【英文标题】:Noisy validation loss in Keras when using fit_generator 【发布时间】:2018-04-09 11:07:17 【问题描述】:

关于为什么的任何想法our training loss is smooth and our validation loss is that noisy (see the link) across epochs?我们正在使用@987654322提供的眼底照片数据集实施糖尿病视网膜病变检测(二元分类)的深度学习模型@。我们正在使用带有 Tensorflow 后端的 Keras 2.0

由于数据集太大而无法放入内存,我们使用fit_generatorImageDataGenerator 随机从训练和验证文件夹中获取图像:

# 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。 You can find our implementation in Github

这绝对与过度拟合无关,因为我们尝试使用高度正则化的模型并且行为完全相同。 是否与验证集的抽样有关?你们之前有没有遇到过类似的问题?

谢谢!!

【问题讨论】:

您为训练模型选择的训练/测试比率是多少?你有多少训练和测试数据?此外,当您尝试多次训练时,是否会发生这种嘈杂的验证损失?如果您提供您在此处使用的所有参数(每个时期的步数、时期等)会有所帮助 训练样本的数量约为 32.000,其中大约 20% 为正样本,80% 为负样本。我在 3000 个验证样本中的分布完全相同。我已经使用不同的正则化策略组合(辍学、权重衰减、批量归一化、增强等)训练了模型,但我总是得到相同的噪声验证损失。每个 epoch 的步数等于训练样本数除以批量大小(大约 100 步)。 你有没有发现什么有用的东西? @user2227561 【参考方案1】:

我会按这个顺序看:

validation_generator 实现中的错误(包括步骤 - 它是否会检查所有保留用于验证的图片?) 在validation_generator 中,不要使用增强(原因:增强可能很糟糕,不可学习,而且在训练中,它确实只能通过不可泛化的硬编码关系获得好分数) 将 train/val 拆分更改为 50/50 通过自定义回调计算 epoch 结束时的验证损失(使用相同的函数,但使用回调调用它会产生不同的(更准确,在某些非标准模型下)结果)

如果以上都没有给出更平滑的验证损失曲线,那么我的下一个假设是它就是这样,我可能需要研究模型架构

【讨论】:

以上是关于使用 fit_generator 时 Keras 中的嘈杂验证损失的主要内容,如果未能解决你的问题,请参考以下文章

使用Keras model.fit_generator生成器

keras.fit_generator KeyError: '"小'

keras fit_generator 并行

Keras:网络不使用 fit_generator() 进行训练

keras/scikit-learn:使用 fit_generator() 进行交叉验证

使用 keras.utils.Sequence 和 keras.model.fit_generator 时出现 KeyError。