Resnet Кераса настраивает либо недостаточно, либо слишком хорошо: как я могу сбалансировать тренировку?
Я настраиваю Resnet Keras, предварительно обученный работе с данными imagenet, для работы над определенной классификацией с другим набором данных изображений. Моя модель структурирована следующим образом: Resnet принимает входные данные, а поверх Resnet я добавил свой собственный классификатор. Во время всех экспериментов, которые я пробовал, модель либо не соответствовала, либо переоснащалась.
Я в основном пробовал два подхода:
заблокировать определенное количество
n
слоев к входу, чтобы они не обновлялись во время тренировки. В частности, Resnet имеет 175 слоев, и я попробовал сn
= 0, 10, 30, 50, 80, 175. Во всех этих случаях модель подходит, получая точность по тренировочному набору не более 0,75, а при проверке не более 0,51.заблокировать все слои нормализации партии, а также некоторые
n
слои в начале (как и раньше), сn
= 0, 10, 30, 50. В этих случаях модель подходит, получая более 0,95 точности на тренировочном наборе, но около 0,5 при проверке.
Обратите внимание, что при переходе от Resnet к InceptionV3 и блокировке 50 слоев я получаю точность более 0,95 для наборов проверки и тестирования.
Вот основная часть моего кода:
inc_model = ResNet50(weights='imagenet',
include_top=False,
input_shape=(IMG_HEIGHT, IMG_WIDTH, 3))
print("number of layers:", len(inc_model.layers)) #175
#Adding custom Layers
x = inc_model.output
x = GlobalAveragePooling2D()(x)
x = Dense(1024, activation="relu")(x)
x = Dropout(0.5)(x)
x = Dense(512, activation="relu")(x)
predictions = Dense(2, activation="softmax")(x)
model_ = Model(inputs=inc_model.input, outputs=predictions)
# fine tuning 1
for layer in inc_model.layers[:30]:
layer.trainable = False
# fine tuning 2
for layer in inc_model.layers:
if 'bn' in layer.name:
layer.trainable = False
# compile the model
model_.compile(optimizer=SGD(lr=0.0001, momentum=0.9)
, loss='categorical_crossentropy'
, metrics=['accuracy'])
checkpointer = ModelCheckpoint(filepath='weights.best.inc.male.resnet.hdf5',
verbose=1, save_best_only=True)
hist = model_.fit_generator(train_generator
, validation_data = (x_valid, y_valid)
, steps_per_epoch= TRAINING_SAMPLES/BATCH_SIZE
, epochs= NUM_EPOCHS
, callbacks=[checkpointer]
, verbose=1
)
Кто-нибудь может подсказать, как найти устойчивое решение, которое чему-то научится, но не подходит?
РЕДАКТИРОВАТЬ: результат фазы обучения выглядит примерно так:
Epoch 1/20
625/625 [==============================] - 2473s 4s/step - loss: 0.6048 - acc: 0.6691 - val_loss: 8.0590 - val_acc: 0.5000
Epoch 00001: val_loss improved from inf to 8.05905, saving model to weights.best.inc.male.resnet.hdf5
Epoch 2/20
625/625 [==============================] - 2432s 4s/step - loss: 0.4445 - acc: 0.7923 - val_loss: 8.0590 - val_acc: 0.5000
Epoch 00002: val_loss did not improve from 8.05905
Epoch 3/20
625/625 [==============================] - 2443s 4s/step - loss: 0.3730 - acc: 0.8407 - val_loss: 8.0590 - val_acc: 0.5000
Epoch 00003: val_loss did not improve from 8.05905
и так далее.. Каждый раз, когда нет никаких улучшений в валидации
2 ответа
У вас есть много вариантов, но вы пытались остановиться раньше? или вы можете попытаться сделать некоторое увеличение данных, или протестировать с более простой моделью.
В Resnet, если вы не используете preprocessing_function resnet, попробуйте использовать ее, как показано ниже:
train_datagen = ImageDataGenerator(dtype = 'float32', preprocessing_function=tf.keras.applications.resnet.preprocess_input)
test_datagen = ImageDataGenerator(dtype = 'float32', preprocessing_function=tf.keras.applications.resnet.preprocess_input)
Все остальное оставьте без изменений.