概述
从 猫狗识别(使用VGG16神经网络) 可知,训练第8次时,发生过拟合。在数据集只有2000张图片的情况下,准确率已经达到92%
本节 通过微调,让准确率再次提升
注意
本文介绍的方法,是在 猫狗识别(使用VGG16神经网络) 基础之上
并且一定是发生 过拟合 后,再继续训练 否则无效
微调方法
前提
通过 猫狗识别(使用VGG16神经网络) 文章中的方法,进行训练,直到 发生 过拟合
此时已经 将 全连接层 和 输出层 训练好
回忆上文中的模型,用到VGG16的 卷积层 和 池化层,且冻结它们的权重,所以训练时,只会改变 全连接层 和 输出层 的权重
设置后面的层可训练权重
冻结VGG16前面的m层,但可以训练后面的n层
例子:
covn_base.trainable=True
for item in covn_base.layers[:-3]:
item.trainable=False
训练
在之前过拟合的基础之上,再次训练
此时:vgg16的 后面n层,全连接层 和 输出层,都可以训练
学习速率要降低,如:0.00005
例子:
model.compile(optimizer=tf.keras.optimizers.Adam(lr=0.00005),loss="binary_crossentropy",metrics=["acc"])
原理
在卷积神经网络中,越是前面的层,图片越大,卷积核较小(一般3x3),提取的是纹理,通常提取的是 通用 特征
随着经过池化层,其特征图会减小,也就是说:越到后面的层,特征图越小,卷积核大小未改变(仍是3x3),此时 卷积核的 视野 相对越来越大,提取的是更加完整的特征。如果是猫的图片,最后提取的就是猫的抽象特征
代码
接 猫狗识别(使用VGG16神经网络) 文章后面写,而且 必须在训练过拟合后,继续训练,否则无效
只允许后面3层可训练
只允许后面3层的权重可训练
covn_base.trainable=True
for item in covn_base.layers[:-3]:
item.trainable=False
编译
注意: 学习速度要很小
model.compile(optimizer=tf.keras.optimizers.Adam(lr=0.00005),loss="binary_crossentropy",metrics=["acc"])
训练
history=model.fit(train_ds2,epochs=25,validation_data=test_ds2,initial_epoch=15)
注意: 由于是 过拟合 后,再次训练,所以要设置 initial_epoch参数,表示从第16次开始训练,共训练 25-15=10次
查看图片
plt.plot(history.epoch,history.history["acc"],label="acc")
plt.plot(history.epoch,history.history["val_acc"],label="val_acc")
plt.legend()


