使用VGGFace权重微调VGG模型

时间:2019-01-23 05:57:06

标签: keras vgg-net

我正在使用经过微调的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 个答案:

答案 0 :(得分:1)

尝试以比默认值(例如1e-4)小的学习率进行训练。来自分类层的随机权重可以带来较大的梯度更新。这些将在下层引起较大的权重更新,并基本上破坏卷积基数中的预训练权重。

此外,当验证准确性停止提高时,您可以使用ReduceLROnPlateau回调来进一步降低学习率。

另一种避免较大破坏性梯度更新的策略是先冻结卷积基数中的权重,对分类层进行预训练,然后以较小的学习率微调整个堆栈。 Keras关于转移学习的博客文章对此方法进行了详细说明:https://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html