Keras 带VGG面权重的VGG模型微调

Keras 带VGG面权重的VGG模型微调,keras,vgg-net,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_l

我正在使用一个经过微调的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)

尝试使用比默认学习率更低的学习率(例如,1e-4)进行培训。来自分类层的随机权重可以带来较大的梯度更新。这将导致较低层中的较大权重更新,并基本上破坏卷积基中的预训练权重

此外,当验证精度停止增加时,您可以使用回调来进一步降低学习速率


另一种避免大规模破坏性梯度更新的策略是,首先冻结卷积基中的权重,预先训练分类层,然后以较小的学习速率微调整个堆栈。Keras关于迁移学习的博客文章详细解释了这种方法:

你能尝试以低于默认学习率的训练吗?比如1e-4。来自分类层的随机权重会带来较大的梯度更新,基本上会破坏卷积基中的预训练权重。谢谢。该模型现在运行得更好了。我将发布一个答案。小疑问:我们正在冻结卷积基的权重,那么这是如何破坏卷积基预训练权重的?你是如何冻结它们的?我在你的代码中找不到,vgg_x=VGGFace(model='vgg16',weights='VGGFace',input_shape=(224224,3),include_top=False)用于vgg_x.layers[:-4]:layer.tranable=False last_layer=vgg_x.get_layer('pool5')。输出希望稍后能给出更好的结果。当我使用Adam的默认学习率时,我的准确率为0.027%@AmruthLakkavaram不使用Adam,首先使用学习率非常低的SGD。亚当为甘斯工作得很好,除此之外,我自己的运气也很差。