我有大约6200个训练图像,我想使用flow(X, y)
类的keras.preprocessing.image.ImageDataGenerator
方法以下列方式扩充小数据集:
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个时期的训练设置,每个时期1920个样本和32个batch_size,我得到了以下训练痕迹:
1920/1920 [==============================] - 3525s - loss: 3.9101 - val_loss: 0.0269
Epoch 2/10
1920/1920 [==============================] - 3609s - loss: 1.0245 - val_loss: 0.0229
Epoch 3/10
1920/1920 [==============================] - 3201s - loss: 0.7620 - val_loss: 0.0161
Epoch 4/10
1916/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
为什么生成器不会像文档那样生成无限批次?
答案 0 :(得分:4)
所以基本上KerasImageGenerator
类实现中存在一个小错误。有什么好处 - 除了这个恼人的警告之外没有任何错误发生。所以要澄清:
flow
和flow_from_directory
实际上都是无限循环中的样本。您可以通过测试以下代码轻松检查(警告 - 它将冻结您的Python
):
for x, y in train_generator:
x = None
您提到的警告是用fit_generator
方法进行的。它基本上检查在一个时期内处理的样本数是否小于或等于samples_per_epoch
。在你的情况下 - samples_per_epoch
可以被batch_size
整除 - 如果Keras的实现是正确的 - 这个警告应该永远不会被提出......但是......
..是的,为什么会发出这个警告?这有点棘手。如果你更深入地实现了一个生成器,你会注意到生成器正在以下列方式获得批处理:如果你让我们说 - 10个例子和batch_size = 3
那么:
不要问我为什么 - 这就是生成器的实现方式。好的是它几乎不会影响培训过程。
所以 - 总结一下 - 您可以忽略此警告,也可以将传递给生成器的样本数量整除为batch_size
。我知道它很麻烦,我希望它能在下一个版本中修复。