part1
model.trainable = True
fine_tune_at = 6
for layer in model.layers[:fine_tune_at]:
layer.trainable = False
pass
迁移学习一般都是用源域数据训练好模型之后再用目标域数据微调部分网络层参数。想要冻结部分网络层只需要将训练好的模型设置为可训练
model.trainable = True
再将你想冻结的网络层设置为不可训练即可,本次例子就是冻结网络模型的前六层。
part2
迁移网络模型时往往需要对网络模型顶层做一些修改,比如用凯斯西储大学数据集训练的9分类网络模型,迁移到西交大数据集的5分类时,就需要对最后的分类层修改。使用pop()方法可删除最顶层网络层
model = models.load_model('weights.best.hdf5')
model.summary()
model.pop()
model.add(Dense(5,activation='softmax',name='dense_output'))
model.summary()
模型结构如下:
删除之前:
max_pooling1d_4 (MaxPooling1 (None, 32, 4) 0
_________________________________________________________________
global_average_pooling1d (Gl (None, 4) 0
_________________________________________________________________
dense (Dense) (None, 9) 45
=================================================================
删除之后:
max_pooling1d_4 (MaxPooling1 (None, 32, 4) 0
_________________________________________________________________
global_average_pooling1d (Gl (None, 4) 0
=================================================================
新增网络层:
max_pooling1d_4 (MaxPooling1 (None, 32, 4) 0
_________________________________________________________________
global_average_pooling1d (Gl (None, 4) 0
_________________________________________________________________
dense (Dense) (None, 5) 25
=================================================================
本文介绍了在迁移学习中如何冻结部分网络层以进行微调。通过设置模型的可训练状态,可以固定前六层网络不进行训练。同时,针对不同任务的分类数量,展示了如何删除和新增网络层,如从9分类到5分类的结构调整过程。

3485

被折叠的 条评论
为什么被折叠?



