基于DeneNet,使用keras搭建模型,用imagenet的权重进行预训练。densenet169的layers数量未595,冻结模型前593,增加一个2分类的dense层,使用图片训练。
本篇仅对模型的训练和调整步骤进行记录。对超参数的调整以及相关问题,请看后续文章。
https://blog.youkuaiyun.com/Labiod/article/details/105296184
微调模型、冻结参数
对模型进行微调之前,需要先对模型的整体框架进行一个了解。微调的层数为整个网络框架的最后的全连接层。这里使用plot_model()函数,显示出框架内的整体结构:
from keras.utils import plot_model
plot_model(model, to_file='../ModelImage/DenseNet169.jpg', show_shapes=True) # 使用Keras的自带库显示框架结构
修改前的模型(只截取末端的几层):

对这个模型做微调。使用基于denseNet在imageNet预训练好的权重。
步骤如下:
选取取消头部全连接层的模型作为基模型 --》 添加新的全连接层并将其与之前层连接起来 --》 冻结相应预训练参数模型 —》对新的模型进行complie
代码如下:
base_model = DenseNet169(include_top=False, weights='imagenet', input_shape=(IN_WIDTH,INT_HEIGHT, 3))
# dinclude_top=False 表示取消模型顶部的全连接层
# weights='imagenet' 表示使用预训练的权重
model = add_new_last_layer(base_model, 2)
# 设置新的全连接层,并将其与之前的层数连接起来
for layer in model.layers[:595]: # DenseNet169需要冻结前595层
layer.trainable = False # 冻结模型全连接层之前的参数
model.compile(optimizer=SGD(lr=learning_rate, momentum=0.9), loss=[mycrossentropy()], metrics=['accuracy'])
# 对模型进行新的编译 ,同时设定优化器、learning rate等参数
连接全连接层与base_model代码add_new_last_layer()如下:
def add_new_last_layer(base_model, nb_classes, drop_rate=0.):
"""Add last layer to the convnet
Args:
base_model: keras model excluding top
nb_classes: # of classes
Returns:
new keras mod

本文详细介绍了如何使用Keras框架和DenseNet169模型进行图像分类任务,包括模型微调、数据增强及训练流程。通过预训练权重提升模型性能,适用于小数据集场景。
最低0.47元/天 解锁文章
1206





