图像数据生成器未生成足够的样本



我在关注F.Chollet的书"使用python进行深度学习"一个例子都做不出来。特别地,我正在运行一个来自章节";在小数据集上从头开始训练convnet";。我的训练数据集有2000个样本,我正在尝试使用ImageDataGenerator进行扩展。尽管我的代码完全相同,但我还是出现了错误:

您的输入数据用完;中断训练。确保您的数据集或生成器至少可以生成steps_per_epoch * epochs批次(在本例中为10000个批次)。

from keras import layers
from keras import models
from keras import optimizers
from keras.preprocessing.image import ImageDataGenerator
# creating model
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu',
input_shape=(150, 150, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Flatten())
model.add(layers.Dropout(0.5))
model.add(layers.Dense(512, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))
# model compilation
model.compile(loss='binary_crossentropy',
optimizer=optimizers.RMSprop(lr=1e-4),
metrics=['acc'])
# model.summary()
# generating trains and test sets with rescaling 0-255 -> 0-1
train_dir = 'c:\Work\Code\Python\DL\cats_and_dogs_small\train\'
validation_dir = 'c:\Work\Code\Python\DL\cats_and_dogs_small\validation\'
train_datagen = ImageDataGenerator(
rescale=1./255,
rotation_range=40,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True,)
# Note that the validation data should not be augmented!
test_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory(
# This is the target directory
train_dir,
# All images will be resized to 150x150
target_size=(150, 150),
batch_size=32,
# Since we use binary_crossentropy loss, we need binary labels
class_mode='binary')
validation_generator = test_datagen.flow_from_directory(
validation_dir,
target_size=(150, 150),
batch_size=32,
class_mode='binary')
for data_batch, labels_batch in train_generator:
print('data batch shape:', data_batch.shape)
print('labels batch shape:', labels_batch.shape)
break
history = model.fit_generator(
train_generator,
steps_per_epoch=100,
epochs=100,
validation_data=validation_generator,
validation_steps=50)

这是本书样本的github页面链接。在那里你也可以检查代码。

我不知道我做错了什么,也不知道我在征求什么意见。谢谢

似乎batch_size应该是20而不是32。

由于您有steps_per_epoch = 100,在进入下一个历元之前,它将在列车发电机上执行next()100次。

现在,在train_generator中,batch_size32,因此它可以生成2000/32个批次,假设您有2000个训练样本。这大约是62

所以在63th上,在train_generator上执行next()的时间将不会给出任何结果,并且它将告诉Your input ran out of data;

理想情况下,

steps_per_epoch = total_traing_sample / batch_size

上面的答案很好地描述了您的问题。我想补充一点,你也可以通过添加这些行来获得正确的steps_per_epoch值。

train_steps = train_generator.__len__()
val_steps = validation_generator.__len__()

我在处理带有扩充的数据生成时遇到了同样的问题。

上面提供的解决方案是真正的steps_per_epoch = total_training_sample / batch_size

但既然你在增强图像,我相信你不会介意用不同的增强传递同一张图像。

对我来说,我使用了与Chollet相同的带有tensorflow背景的keras版本,它消除了这个错误。在这种情况下,它将无限期地向您提供图像,因为当它从可用图像中完成时会循环。

希望这能帮助

相关内容

  • 没有找到相关文章

最新更新