我有大约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
类实现中有一个小错误。值得庆幸的是,除了这个烦人的警告之外,没有什么问题。因此,为了澄清:
-
flow
和flow_from_directory
实际上是以无限循环的方式生成样本。你可以通过测试以下代码轻松验证这一点(警告 – 这会使你的Python
冻结):for x, y in train_generator: x = None
-
你提到的警告是在
fit_generator
方法中触发的。它基本上检查在一个epoch中处理的样本数量是否小于或等于samples_per_epoch
。在你的情况下 – 其中samples_per_epoch
可以被batch_size
整除 – 如果Keras的实现是正确的 – 这个警告应该永远不会被触发…但是… -
…是的,那么为什么会触发这个警告呢?这有点棘手。如果你深入研究生成器的实现,你会注意到生成器获取批次的方式如下:假设你有10个例子,
batch_size = 3
,那么:- 它会首先打乱这10个例子的顺序,
- 然后它会取打乱顺序后的前三个例子,然后是接下来的三个,以此类推,
- 在第三个批次之后 – 当只剩下一个例子时 – 它会返回一个批次…只包含一个样本。
别问我为什么 – 这就是生成器的实现方式。好消息是它几乎不影响训练过程。
所以,总结来说,你可以忽略这个警告,或者你可以确保传递给生成器的样本数量可以被batch_size
整除。我知道这很麻烦,我希望它会在下一个版本中得到修复。