本文主要是介绍迁移学习【二】:神经网络之微调(fine-turning),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
微调
- 一、增加或替换层
- 二、微调fine-turning
算法实现语言 | Python |
---|---|
神经网络框架 | Tensorflow/Keras |
所用网络 | LSTM |
回顾,迁移学习过程:
①训练模型
②冻结模型部分层(一般指除全连接层外的所有层)
(上节内容)
————————————————————————
(本节内容)
③在冻结的层后增加或替换层 ←
④使用新数据重新训练,这时候学习率要很小(俗称微调fine-turning)←
近期更新(2022.4.25),增加了一行缺失的代码:output = Reshape([num_classes])(layer_softmax)
一、增加或替换层
承接上一节的代码,我们冻结了除全连接层外的所有层。保留了绝大部分前面训练的参数:
for layer in model.layers [:-3]:print(layer.name)layer.trainable = False
下一步,我们增加或替换网络的层(本质上就是重构网络)。
在本案例中,为方便读者理解, 我懒得改(●’◡’●) 我们保持结构不便。将1至倒数第四层的网络全部拿来:
x = model.layers[-4].output
然后在后续添加全连接层。微调的学习率要小,否则容易过拟合,这里设置学习率=0.0001(默认0.001)
x = model.layers[-4].output layer_dense1 = Dense(num_classes, name="dense1")(x)
layer_softmax = Activation('softmax')(layer_dense1)
output = Reshape([num_classes])(layer_softmax)
model = Model(inputs=input, outputs=output)
model.compile(Adam(learning_rate=0.0001),loss='categorical_crossentropy', metrics=['accuracy'], experimental_run_tf_function=False)
model.summary()
二、微调fine-turning
重构好模型后,使用新环境下的数据进行微调(本质上就是再训练)
x_train_fineturning是新的训练数据
y_train_fineturning是对应的标签
history2 = model.fit(x_train_fineturning,y_train_fineturning,batch_size=batch_size,epochs=10,verbose=2,validation_split = 0.1,callbacks = [tf.keras.callbacks.ModelCheckpoint(filepath, monitor='val_accuracy', verbose=0, save_best_only=True, mode='max'),#学习率系数0.5tf.keras.callbacks.ReduceLROnPlateau(monitor='val_loss', factor=0.7, patience=3, verbose=1),tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=6, verbose=0, mode='auto')])
微调过程可视化:
由于微调过程很容易过拟合,训练完后,为进一步检验模型泛化能力,使用测试集的数据进行测试。
测试结果还OK
以上便是迁移学习的简单应用,是不是很简单~
上一章 迁移学习【一】:实现神经网络层的冻结
这篇关于迁移学习【二】:神经网络之微调(fine-turning)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!