如何复用Keras函数式模型层基于预训练模型实现迁移学习
Keras预训练自编码器迁移学习实现方案
前置修正说明
你提供的初始示例代码存在两个语法错误,运行前需要先修复:
- 输出层的激活函数参数名拼写错误:
acitvation→activation - 模型实例化类名首字母需要大写:
keras.model→keras.Model
迁移学习实现步骤
- 加载本地保存的预训练去噪自编码器模型
- 将原模型所有层的
trainable属性设置为False,完成权重冻结 - 截取原模型去掉最后一层后的输出作为特征输出
- 基于该特征输出拼接自定义的新层,构建新的迁移学习模型
- 编译新模型后在目标数据集上训练即可
完整实现代码
import tensorflow as tf import keras def new_model(): # 加载预训练的自编码器模型 old_model = keras.models.load_model('../best_model.h5') # 冻结原模型所有层参数 for layer in old_model.layers: layer.trainable = False # 截取原模型去掉最后一层的输出 # 如果你需要调整截取的层位置,修改索引即可,-1代表最后一层,-2代表倒数第二层 feature_output = old_model.layers[-2].output # 在这里添加你需要的新层,示例添加2层全连接层,可根据需求修改 x = keras.layers.Dense(32, activation='relu')(feature_output) x = keras.layers.Dense(16, activation='relu')(x) # 最后一层根据你的任务设置输出维度和激活函数,示例做10分类就设为10+softmax new_output = keras.layers.Dense(10, activation='softmax')(x) # 构建新模型,输入和原模型一致,输出为新定义的输出 transfer_model = keras.Model(inputs=old_model.input, outputs=new_output) return transfer_model # 实例化新模型 model = new_model() # 编译模型,损失函数和评估指标根据你的任务调整,示例为分类任务 model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) # 训练模型,传入你的数据集X和y chk_point = keras.callbacks.ModelCheckpoint(f'./transfer_best_model.h5', monitor='val_loss', save_best_only=True, mode='min') model.fit(X, y, batch_size=32, epochs=50, validation_split=0.2, callbacks=[chk_point])
补充说明
- 如果你的自编码器结构里有
BatchNormalization等特殊层,冻结后训练时默认会适配运行逻辑,避免非训练状态下的均值方差更新 - 如果你后续需要微调解冻部分层,只需要把对应层的
trainable设置为True,调低学习率重新编译训练即可
内容的提问来源于stack exchange,提问作者Ankit Kalauni
相关产品推荐
相关产品推荐

