基于Keras、DenseNet模型微调、参数冻结、数据增强、模型训练、模型验证全流程记录(模型微调开发全流程记录)

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

基于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
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值