Keras警告:一个epoch包含了超过`samples_per_epoch`的样本

我有大约6200张训练图像,我想使用keras.preprocessing.image.ImageDataGenerator类的flow(X, y)方法来增强小数据集,具体方法如下:

train_datagen = ImageDataGenerator(        rescale=1./255,        shear_range=0.2,        zoom_range=0.2,        horizontal_flip=True)test_datagen = ImageDataGenerator(rescale=1./255)train_generator = train_datagen.flow(X_train , y_train)validation_generator = test_datagen.flow(X_val , y_val)history = model.fit_generator(        train_generator,        samples_per_epoch=1920,        nb_epoch=10,        verbose=1,        validation_data=validation_generator,        nb_val_samples=800)

其中X_train / y_train包含大约6000张训练图像和标签,而X_val / y_val包含验证数据,模型是一个增强的VGG16模型。

文档中说明

flow(X, y): 接受numpy数据和标签数组,并生成增强/归一化的数据批次。以无限循环的方式持续生成批次。

对于设置为10个epoch,每个epoch有1920个样本,批次大小为32的训练设置,我得到了以下训练记录:

1920/1920 [==============================] - 3525s - loss: 3.9101 - val_loss: 0.0269Epoch 2/101920/1920 [==============================] - 3609s - loss: 1.0245 - val_loss: 0.0229Epoch 3/101920/1920 [==============================] - 3201s - loss: 0.7620 - val_loss: 0.0161Epoch 4/101916/1920 [============================>.] - ETA: 4s - loss: 0.5978 C:\Miniconda3\envs\carnd-term1\lib\site-packages\keras\engine\training.py:1537: UserWarning: Epoch comprised more than `samples_per_epoch` samples, which might affect learning results. Set `samples_per_epoch` correctly to avoid this warning.  warnings.warn('Epoch comprised more than 

为什么生成器没有像文档中所说的那样生成无限批次呢?


回答:

所以基本上在KerasImageGenerator类实现中有一个小错误。值得庆幸的是,除了这个烦人的警告之外,没有什么问题。因此,为了澄清:

  1. flowflow_from_directory实际上是以无限循环的方式生成样本。你可以通过测试以下代码轻松验证这一点(警告 – 这会使你的Python冻结):

    for x, y in train_generator:    x = None
  2. 你提到的警告是在fit_generator方法中触发的。它基本上检查在一个epoch中处理的样本数量是否小于或等于samples_per_epoch。在你的情况下 – 其中samples_per_epoch可以被batch_size整除 – 如果Keras的实现是正确的 – 这个警告应该永远不会被触发…但是…

  3. …是的,那么为什么会触发这个警告呢?这有点棘手。如果你深入研究生成器的实现,你会注意到生成器获取批次的方式如下:假设你有10个例子,batch_size = 3,那么:

    • 它会首先打乱这10个例子的顺序,
    • 然后它会取打乱顺序后的前三个例子,然后是接下来的三个,以此类推,
    • 在第三个批次之后 – 当只剩下一个例子时 – 它会返回一个批次…只包含一个样本。

    别问我为什么 – 这就是生成器的实现方式。好消息是它几乎不影响训练过程。

所以,总结来说,你可以忽略这个警告,或者你可以确保传递给生成器的样本数量可以被batch_size整除。我知道这很麻烦,我希望它会在下一个版本中得到修复。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注