当我尝试使用fit_generator训练Keras时,为什么Keras在第一个纪元就停止了?

时间:2018-11-25 20:52:54

标签: python tensorflow keras

我正在使用Keras来微调现有的VGG16模型,并正在使用fit_generator来训练最后4层。这是我正在使用的相关代码:

# Create the model
model = models.Sequential()

# Add the vgg convolutional base model
model.add(vgg_conv)

# Add new layers
model.add(layers.Flatten())
model.add(layers.Dense(1024, activation='relu'))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(5, activation='softmax'))

# Show a summary of the model. Check the number of trainable params
model.summary()
from keras.preprocessing.image import ImageDataGenerator

train_datagen = ImageDataGenerator(
    rescale=1./255,
    rotation_range=20,
    width_shift_range=0.2,
    height_shift_range=0.2,
    horizontal_flip=True,
    fill_mode='nearest')

validation_datagen = ImageDataGenerator(rescale=1./255)

#Change the batchsize according to the system RAM
train_batchsize = 100
val_batchsize = 10

train_dir='training_data/train'
validation_dir='training_data/validation'

train_generator = train_datagen.flow_from_directory(
    train_dir,
    target_size=(image_size1, image_size2),
    batch_size=train_batchsize,
    class_mode='categorical')

validation_generator = validation_datagen.flow_from_directory(
    validation_dir,
    target_size=(image_size1, image_size2),
    batch_size=val_batchsize,
    class_mode='categorical',
    shuffle=False)

# Compile the model
model.compile(loss='categorical_crossentropy',
              optimizer=optimizers.RMSprop(lr=1e-4),
              metrics=['acc'])

# Train the model
history = model.fit_generator(
    train_generator,
    steps_per_epoch=train_generator.samples/train_generator.batch_size,
    epochs=30,
    validation_data=validation_generator,
    validation_steps=validation_generator.samples/validation_generator.batch_size,
    verbose=1)

问题在于,当我运行脚本来训练模型时,它可以正常工作,直到开始实际训练为止。在这里,它停留在时代1/30。

Layer (type)                 Output Shape              Param #
=================================================================
vgg16 (Model)                (None, 15, 20, 512)       14714688
_________________________________________________________________
flatten_1 (Flatten)          (None, 153600)            0
_________________________________________________________________
dense_1 (Dense)              (None, 1024)              157287424
_________________________________________________________________
dropout_1 (Dropout)          (None, 1024)              0
_________________________________________________________________
dense_2 (Dense)              (None, 5)                 5125
=================================================================
Total params: 172,007,237
Trainable params: 164,371,973
Non-trainable params: 7,635,264
_________________________________________________________________
Found 1989 images belonging to 5 classes.
Found 819 images belonging to 5 classes.
Epoch 1/30

不幸的是,这不好。我在网上环顾四周,我相信问题出在使用fit_generator。 Keras中关于fit_generator的代码有些错误。但是,其他大多数遇到纪元问题的人最终都陷在后来的纪元上(例如,有人想将其运行20个纪元,并在19/20纪元停止)。

我将如何解决此问题?这是我第一次进行深度学习,因此我感到非常困惑,不胜感激。我是否只需要使用model.fit()?

3 个答案:

答案 0 :(得分:1)

您必须将有效的整数编号作为fit_generator()steps_per_epoch参数传递给validation_steps。 因此,您可以按如下方式使用:

history = model.fit_generator(
    train_generator,
    steps_per_epoch=train_generator.samples//train_generator.batch_size,
    epochs=30,
    validation_data=validation_generator, validation_steps=validation_generator.samples//validation_generator.batch_size,
    verbose=1)

我看到的第二个因素是您的模型具有165M可训练的参数,该参数具有巨大的内存消耗,尤其是具有很高的 batchsize 。 您应该使用较低分辨率的图像,请注意,在许多情况下,使用它们可以获得更好的效果。

答案 1 :(得分:1)

我在Colab上遇到了同样的问题。我查看了运行时日志,上面写着:“填满随机缓冲区(可能需要一段时间):1195 of 5000”。

所以对我而言,这仅仅是因为改组缓冲区的大小太大,并且需要很长时间才能将数据加载到内存中。

答案 2 :(得分:0)

我遇到了同样的问题,并在设置validate_steps = validation_size // batch_size后解决了该问题