Как исправить потерю трансферного обучения с помощью Keras - PullRequest
0 голосов
/ 03 апреля 2019

Я занимаюсь трансферным обучением на предварительно обученной модели с собственным набором данных.Вскоре я использовал предварительно обученную модель resnet50 с входной формой 224x224.Я загружаю модель как:

  train_datagen = ImageDataGenerator(validation_split=0.1,rescale=1./255,preprocessing_function=preprocess_input) # set validation split

    img_size = 224

    batch_size = 32

    train_generator = train_datagen.flow_from_directory(
        train_data_dir,
        target_size=(img_size, img_size),
        batch_size=batch_size,
        color_mode='rgb',
        subset='training') # set as training data

    validation_generator = train_datagen.flow_from_directory(
        train_data_dir, # same directory as training data
        target_size=(img_size, img_size),
        batch_size=batch_size,
        color_mode='rgb',
        subset='validation') # set as validation data


model = ResNet50(include_top=False, weights=None, input_shape=(224,224,3))
model.load_weights("a trained model weights on 224x224")

model.layers.pop()

for layer in model.layers:
   layer.trainable = False

x = model.layers[-1].output

x = Flatten(name='flatten')(x)
x = Dropout(0.2)(x)
x = Dense(1024, activation='relu')(x)
predictions = Dense(101, activation='softmax', name='pred_age')(x)

top_model = Model(inputs=model.input, outputs=predictions)

top_model.compile(loss='categorical_crossentropy',
        optimizer=adam,
        metrics=[accuracy])

EPOCHS = 100
BATCH_SIZE = 32
STEPS_PER_EPOCH = 4424 // BATCH_SIZE
VALIDATION_STEPS = 466 // BATCH_SIZE

callbacks = [LearningRateScheduler(schedule=Schedule(EPOCHS, initial_lr=lr_rate)),
                ModelCheckpoint(str(output_dir) + "/weights.{epoch:03d}-{val_loss:.3f}-{val_age_mae:.3f}.hdf5",
                                 monitor="val_age_mae",
                                 verbose=1,
                                 save_best_only=False,
                                 mode="min")
                 ]

hist = top_model.fit_generator(generator=train_set,
                               epochs=100,
                               steps_per_epoch = 4424//32,
                               validation_data=val_set,
                               validation_steps = 466//32,
                               verbose=1,
                               callbacks=callbacks)    

Всего параметров: 75 020 261 Обучаемых параметров: 51 432 549 Необучаемых параметров: 23 587 712

Эпоха 1/100 140/140 [==============================] - 1033 с 7 с / шаг - потеря:> 14.5776 - age_mae: 12.2994 - val_loss: 15.6144 - val_age_mae: 24.8527

Epoch 00001: val_age_mae улучшено с inf до 24.85268, сохраняя модель> Epoch 2/100 140/140 [=====================================] - 969 с 7 с / шаг - потеря: 14,7104 - age_mae: 11,2545 - val_loss: 15,6462 - val_age_mae: 25,1104

TEpoch 00002: val_age_mae не улучшилось с 24,85268 TEpoch 3/100 T140 /140 [==============================] - 769s 5 с / шаг - потеря:> T14.6159 - age_mae: 13.5181 -val_loss: 15.7551 - val_age_mae: 29.4640

эпоха 00003: val_age_mae не улучшается с 24.85268 эпохи 4/100 140/140 [==============================] - 815 с 6 с / шаг - потеря:> 14.6509 - age_mae: 13.0087 - val_loss: 15.9366 - val_age_mae: 18.3581 Эпоха 00004: val_age_mae улучшена fот 24.85268 до 18.35811 Epoch 5/100 140/140 [============================== - 1059 с 8 с / шаг - потеря:>> 14.3882 - age_mae: 11.8039 - val_loss: 15.6825 - val_age_mae: 24.6937

Эпоха 00005: val_age_mae не улучшалась с 18.35811 Эпоха 6/100 140/140 [==============================] - 1052 с 8 с / шаг - потеря:> 14.4496 - age_mae: 13.6652 - val_loss: 15.4278 - val_age_mae: 24.5045 Эпоха 00006: val_age_mae не улучшилось с18.35811

Я уже запускал эту пару раз, и после эпохи 4 он уже не улучшается.Также набор данных содержит около 5000 изображений.4511 изображений, принадлежащих обучающему набору.476 изображений, принадлежащих проверенному набору.

Я получаю следующий график потерь

loss graph result

...