迁移学习冻结部分网络层及修改网络层方法

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        
=================================================================

你可能感兴趣的:(python,深度学习,tensorflow)