如何使用预训练VGG16实现多输出迁移学习并配置对应编译参数?
解决方案
你只需要用预训练VGG16替换原有自定义的卷积特征提取部分,输出分支结构、编译配置可以完全复用你现有代码的逻辑,完整实现代码如下:
import tensorflow as tf from tensorflow.keras import layers from keras.applications.vgg16 import VGG16 # 加载预训练VGG16,去掉顶层分类头 vgg16_model = VGG16(weights='imagenet', include_top=False, input_shape=(224,224,3)) # 可选:先冻结VGG16的所有层,先训练自定义输出头,避免破坏预训练特征 vgg16_model.trainable = False def vgg16_multi_output_model(): input = tf.keras.layers.Input(shape=(224,224,3)) # 用VGG16做特征提取,替换原来的自定义卷积层 x = vgg16_model(input) x = layers.Dropout(0.1)(x) x = layers.Flatten()(x) # 输出分支和你原有结构完全一致 out_col = layers.Dense(512, activation='relu')(x) out_ren = layers.Dense(512, activation='relu')(x) out_col = layers.Dense(1, activation='sigmoid', name='col_out')(out_col) out_ren = layers.Dense(1, activation='relu', name='ren_out')(out_ren) multiOutputModel = tf.keras.models.Model(inputs=input, outputs=[out_col, out_ren]) # 编译配置完全复用你原有参数即可 multiOutputModel.compile( optimizer='adam', loss={ 'ren_out': 'mean_squared_error', 'col_out': 'binary_crossentropy'}, loss_weights={ 'ren_out': 4.0, 'col_out': 0.1}, metrics={ 'ren_out': 'mean_absolute_error', 'col_out': 'accuracy'}) # 修正你原有代码里的小错误:plot_model的第一个参数要传入模型对象 tf.keras.utils.plot_model(multiOutputModel, 'vgg16_multi_output.png', show_shapes=True) return multiOutputModel # 初始化模型查看结构 multiOutputModel = vgg16_multi_output_model() multiOutputModel.summary()
注意事项
- 如果你需要进一步提升模型效果,可以在输出头训练收敛后,将
vgg16_model.trainable设为True,仅解冻VGG16的最后2-3个卷积块,降低学习率到1e-5级别再微调几轮,避免破坏预训练得到的通用特征 - 训练时传入的标签需要和输出分支对应,使用字典格式传入的话键名对应
col_out和ren_out即可正常计算损失和评估指标
内容的提问来源于stack exchange,提问作者SoyLatte
相关产品推荐
相关产品推荐

