Keras 警告:Epoch 包含的样本不止 `samples_per_epoch`
Posted
技术标签:
【中文标题】Keras 警告:Epoch 包含的样本不止 `samples_per_epoch`【英文标题】:Keras warning: Epoch comprised more than `samples_per_epoch` samples 【发布时间】:2017-06-06 23:53:29 【问题描述】:我有大约 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 的 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
为什么生成器没有像文档所说的那样生成无限批次?
【问题讨论】:
请添加显示您如何定义模型和图像数据生成器的代码。 请查看修改内容。 当你有 6000 张训练图像时,为什么 samples_per_epoch 等于 1920? 如果我将其设置为 6200,那么“Epoch 包含的样本数超过samples_per_epoch
个样本”会不会出现在第二个 epoch 中?
“Epoch”通常意味着将学习算法暴露给整个训练数据集。所以samples_per_epoch
通常等于训练图像的数量。
【参考方案1】:
所以基本上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
整除。我知道这很麻烦,我希望它会在下一个版本中得到修复。
【讨论】:
感谢您的回答。您提到“flow_from_directory 实际上在无限循环中产生样本”。您所说的一切是否也适用于流程方法?因为那是我正在使用的。 是的。我正在更新我的答案。 谢谢马尔辛。如果我使用上面的设置并在每个时期将完整的训练集提供给网络(samples_per_epoch = number_of_training_samples) - 我可以假设生成器在每个时期产生稍微不同的数据集,从而增加方差吗?以上是关于Keras 警告:Epoch 包含的样本不止 `samples_per_epoch`的主要内容,如果未能解决你的问题,请参考以下文章
在 Keras 中拟合模型时,批量大小和 epoch 数应该有多大?
keras.models.Model.fit 中的“时代”是啥?
Keras 交叉验证精度在每个 epoch 后稳定在 (1/output_classes)