Точная настройка модели VGG с весами VGGFace

Я использую тонко настроенную модель VGG16 с использованием предварительно обученных весов VGGFace для работы с помеченными гранями в дикой природе (набор данных LFW). Проблема в том, что я получаю очень низкую точность после тренировки для эпохи (около 0,0037%), то есть модель совсем не обучается.

Я думаю, что это связано с моей архитектурой. Моя архитектура такая:

vgg_x = VGGFace(model = 'vgg16', weights = 'vggface', input_shape = (224,224,3), include_top = False)
last_layer = vgg_x.get_layer('pool5').output
x = Flatten(name='flatten')(last_layer)
x = Dense(4096, activation='relu', name='fc6')(x)

out = Dense(311, activation='softmax', name='fc8')(x)
custom_vgg_model = Model(vgg_x.input, out)

custom_vgg_model.compile(optimizer = keras.optimizers.Adam(), loss = 
keras.losses.categorical_crossentropy, metrics = ['accuracy'])

kfold = KFold(n_splits = 15,random_state = 42)
kf = kfold.get_n_splits(X_train)

for train_index,test_index in kfold.split(X_train):
    X_cross_train = X_train[train_index]
    X_cross_test = X_train[test_index]
    Y_cross_train = y_train[train_index]
    Y_cross_test = y_train[test_index]
    custom_vgg_model.fit(x = X_cross_train,y = Y_cross_train, batch_size = 32, epochs = 10,verbose = 2, validation_data = (X_cross_test,Y_cross_test))

Я ожидаю, что модель будет учиться по крайней мере, если не получит большую точность. В чем может быть проблема? Что-то не так с моей архитектурой или чем-то еще?

Шаг предварительной обработки не должен быть неправильным, но на всякий случай:

image_set_x = keras_vggface.utils.preprocess_input(image_set_x, version=1)

1 ответ

Решение

Попробуйте тренироваться с меньшей скоростью обучения, чем по умолчанию (например, 1e-4). Случайные веса из слоя классификации могут привести к большим обновлениям градиента. Это приведет к большим обновлениям веса в нижних слоях и в основном разрушит предварительно обученные веса в сверточной основе.

Кроме того, вы можете использовать обратный вызов ReduceLROnPlateau для дальнейшего снижения скорости обучения, когда точность проверки перестает расти.

Другая стратегия, позволяющая избежать больших разрушительных обновлений градиента, состоит в том, чтобы сначала заморозить веса в сверточной основе, предварительно обучить слои классификации, а затем точно настроить весь стек с небольшой скоростью обучения. Этот подход подробно объясняется в посте блога Keras по трансферному обучению: https://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html

Другие вопросы по тегам