【问题标题】:Fine tuning model delete previous added layers微调模型删除之前添加的层
【发布时间】:2019-02-27 06:37:19
【问题描述】:

我使用 Keras 2.2.4。我训练了一个模型,我希望每 30 个 epoch 使用新的数据内容(图像分类)对其进行微调。

每天我都会在类中添加更多图像来提供模型。每 30 个 epoch 对模型进行一次重新训练。 我使用 2 个条件,第一个条件是之前没有训练过模型,第二个条件是模型已经训练过,然后我想用新的内容/类对其进行微调。

model_base = keras.applications.vgg19.VGG19(include_top=False, input_shape=(*IMG_SIZE, 3), weights='imagenet')
output = GlobalAveragePooling2D()(model_base.output)

# If we resume a pretrained model load it
if os.path.isfile(os.path.join(MODEL_PATH, 'weights.h5')): 
    print('Using existing weights...')
    base_lr = 0.0001

    model = load_model(os.path.join(MODEL_PATH, 'weights.h5'))
    output = Dense(len(all_character_names), activation='softmax', name='d2')(output)
    model = Model(model_base.input, output)

    for layer in model_base.layers[:-2]:
        layer.trainable = False 
else:
    base_lr = 0.001

    output = BatchNormalization()(output)
    output = Dropout(0.5)(output)
    output = Dense(2048, activation='relu', name='d1')(output)
    output = BatchNormalization()(output)
    output = Dropout(0.5)(output)
    output = Dense(len(all_character_names), activation='softmax', name='d2')(output)
    model = Model(model_base.input, output)

    for layer in model_base.layers[:-5]:
        layer.trainable = False 


opt = optimizers.Adam(lr=base_lr, decay=base_lr / epochs)
model.compile(optimizer=opt,
            loss='categorical_crossentropy',
            metrics=['accuracy'])

第一次模型总结:

...
_________________________________________________________________
block5_conv4 (Conv2D)        (None, 14, 14, 512)       2359808   
_________________________________________________________________
block5_pool (MaxPooling2D)   (None, 7, 7, 512)         0         
_________________________________________________________________
global_average_pooling2d_1 ( (None, 512)               0         
_________________________________________________________________
batch_normalization_1 (Batch (None, 512)               2048      
_________________________________________________________________
dropout_1 (Dropout)          (None, 512)               0         
_________________________________________________________________
d1 (Dense)                   (None, 2048)              1050624   
_________________________________________________________________
batch_normalization_2 (Batch (None, 2048)              8192      
_________________________________________________________________
dropout_2 (Dropout)          (None, 2048)              0         
_________________________________________________________________
d2 (Dense)                   (None, 19)                38931     
=================================================================
Total params: 21,124,179
Trainable params: 10,533,907
Non-trainable params: 10,590,272

模型总结第二次:

...
_________________________________________________________________
block5_conv4 (Conv2D)        (None, 14, 14, 512)       2359808   
_________________________________________________________________
block5_pool (MaxPooling2D)   (None, 7, 7, 512)         0         
_________________________________________________________________
global_average_pooling2d_1 ( (None, 512)               0         
_________________________________________________________________
d2 (Dense)                   (None, 19)                9747      
=================================================================
Total params: 20,034,131
Trainable params: 2,369,555
Non-trainable params: 17,664,576

问题:当模型存在并加载以进行微调时,它似乎已松散了第一次添加的所有附加层(Dense 2048、Dropout 等)

我需要再次添加这些图层吗?这似乎没有任何意义,因为它会丢失第一次传递的训练信息。

注意:我可能不需要设置 base_lr,因为保存模型还应该保存之前停止状态的学习率,但我稍后会检查。

【问题讨论】:

    标签: machine-learning keras deep-learning


    【解决方案1】:

    请注意,加载模型后:

    model = load_model(os.path.join(MODEL_PATH, 'weights.h5'))
    

    你不使用它。你只是再次覆盖它

    model = Model(model_base.input, output)
    

    其中输出也被定义为对 base_model 的操作。 在我看来,您只想删除 load_model 之后的行。

    【讨论】:

    • 完全正确!我需要另一行,因为类号可能会改变,但你适合模型加载,我的错。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2016-10-01
    • 1970-01-01
    • 2021-09-12
    • 2020-06-28
    • 1970-01-01
    • 2017-10-22
    • 2021-07-14
    • 2019-01-14
    相关资源
    最近更新 更多