ToB企服应用市场:ToB评测及商务社交产业平台
标题:
第三章:基于DenseNet(121,161,169,201)卷积神经网络实现的自适应多类别分
[打印本页]
作者:
缠丝猫
时间:
2024-12-19 01:30
标题:
第三章:基于DenseNet(121,161,169,201)卷积神经网络实现的自适应多类别分
目录
1. DenseNet 介绍
2. DenseNet 实现的垃圾图像分类
2.1 垃圾10分类数据集
2.2 训练
2.3 训练结果
2.4 推理
3. 项目下载
1. DenseNet 介绍
DenseNet是一种深度学习架构,卷积神经网络(CNN)的一种变体,旨在解决梯度消失的题目并进步网络连接性。
在传统的CNN中,信息流是顺序的,每一层只连接到下一层。这可能会导致梯度在网络中流传时减小,从而难以训练深度网络。DenseNet旨在通过引入密集连接来缓解这一题目,密集连接允许从网络中的任何层直接连接到任何其他层。
DenseNet由多个密集块组成,每个密集块包含多个层。密集块内的每一层都连接到同一块内的其他每一层。这种密集的连接促进了特性重用和信息流,使梯度更轻易在整个网络中流传。此外,DenseNet在每个密集块后都加入了一个过渡层,以降低特性图的维度并控制网络的增长。
DenseNet的重要优势包括:
改进的梯度流:层之间的直接连接有助于降服梯度消失题目,并实现深度网络的高效训练。
强大的特性重用:密集的连接促进了特性重用,从而实现了更紧凑的网络和更好的参数服从。
参数数量减少:与传统的CNN架构相比,DenseNet通常必要更少的参数,从而使模型更轻易训练,计算服从更高。
进步精度:DenseNet已被证实在各种计算机视觉使命上到达了开始辈的性能,如图像分类和物体检测。
总体而言,DenseNet是一个强大的深度学习架构,可以解决训练深度网络的挑衅。其密集的连接性和高效的参数共享使其成为各种计算机视觉使命的有用选择。
其中,denseNet差异版本的架构如下
2. DenseNet 实现的垃圾图像分类
densenet实现的model部分代码如下面所示,这里如果采用官方预训练权重的话,会主动导入官方提供的最新版本的权重
if model == 'densenet121':
net = m.densenet121(pretrained=m.DenseNet121_Weights.DEFAULT if weights else False,progress=True)
elif model == 'densenet161':
net = m.densenet161(pretrained=m.DenseNet161_Weights.DEFAULT if weights else False,progress=True)
elif model == 'densenet169':
net = m.densenet169(pretrained=m.DenseNet169_Weights.DEFAULT if weights else False,progress=True)
elif model == 'densenet201':
net = m.densenet201(pretrained=m.DenseNet201_Weights.DEFAULT if weights else False,progress=True)
else:
print('模型选择错误!!')
return None
复制代码
2.1 垃圾10分类数据集
数据集的摆放如下:
字典文件:
{
"0": "dianchi",
"1": "lajiao",
"2": "pingguo",
"3": "qiezi",
"4": "taoci",
"5": "tudou",
"6": "xiangjiao",
"7": "yandi",
"8": "yilaguan",
"9": "yinliaoping"
}
复制代码
其中,训练集总数700,验证集总数300,颠末transform预处理的可视化结果如下:
2.2 训练
将数据集按照上述格式摆放好即可开始训练,训练的参数如下:
parser.add_argument("--model", default='densenet121', type=str,help='densenet121,densenet161,densenet169,densenet201')
parser.add_argument("--pretrained", default=True, type=bool) # 采用官方权重
parser.add_argument("--freeze_layers", default=True, type=bool) # 冻结权重
parser.add_argument("--batch-size", default=4, type=int)
parser.add_argument("--epochs", default=30, type=int)
parser.add_argument("--optim", default='SGD', type=str,help='SGD、Adam') # 优化器选择
parser.add_argument('--lr', default=0.001, type=float)
parser.add_argument('--lrf',default=0.0001,type=float) # 最终学习率 = lr * lrf
复制代码
这里分类的个数不必要指定,代码会根据数据集主动生成!
2.3 训练结果
所有的结果都生存在
runs
目录下
这里只展示部分:
训练日志:
"epoch:29": {
"train info": {
"accuracy": 0.9985714285571633,
"dianchi": {
"Precision": 1.0,
"Recall": 1.0,
"Specificity": 1.0,
"F1 score": 1.0
},
"lajiao": {
"Precision": 1.0,
"Recall": 1.0,
"Specificity": 1.0,
"F1 score": 1.0
},
"pingguo": {
"Precision": 1.0,
"Recall": 1.0,
"Specificity": 1.0,
"F1 score": 1.0
},
"qiezi": {
"Precision": 1.0,
"Recall": 1.0,
"Specificity": 1.0,
"F1 score": 1.0
},
"taoci": {
"Precision": 1.0,
"Recall": 0.9857,
"Specificity": 1.0,
"F1 score": 0.9928
},
"tudou": {
"Precision": 1.0,
"Recall": 1.0,
"Specificity": 1.0,
"F1 score": 1.0
},
"xiangjiao": {
"Precision": 1.0,
"Recall": 1.0,
"Specificity": 1.0,
"F1 score": 1.0
},
"yandi": {
"Precision": 0.9859,
"Recall": 1.0,
"Specificity": 0.9984,
"F1 score": 0.9929
},
"yilaguan": {
"Precision": 1.0,
"Recall": 1.0,
"Specificity": 1.0,
"F1 score": 1.0
},
"yinliaoping": {
"Precision": 1.0,
"Recall": 1.0,
"Specificity": 1.0,
"F1 score": 1.0
},
"mean precision": 0.9985900000000001,
"mean recall": 0.99857,
"mean specificity": 0.9998400000000001,
"mean f1 score": 0.99857
},
"valid info": {
"accuracy": 0.9699999999676666,
"dianchi": {
"Precision": 0.9032,
"Recall": 0.9333,
"Specificity": 0.9889,
"F1 score": 0.918
},
"lajiao": {
"Precision": 1.0,
"Recall": 0.9667,
"Specificity": 1.0,
"F1 score": 0.9831
},
"pingguo": {
"Precision": 0.9375,
"Recall": 1.0,
"Specificity": 0.9926,
"F1 score": 0.9677
},
"qiezi": {
"Precision": 0.9677,
"Recall": 1.0,
"Specificity": 0.9963,
"F1 score": 0.9836
},
"taoci": {
"Precision": 1.0,
"Recall": 1.0,
"Specificity": 1.0,
"F1 score": 1.0
},
"tudou": {
"Precision": 1.0,
"Recall": 0.9,
"Specificity": 1.0,
"F1 score": 0.9474
},
"xiangjiao": {
"Precision": 0.9677,
"Recall": 1.0,
"Specificity": 0.9963,
"F1 score": 0.9836
},
"yandi": {
"Precision": 0.9375,
"Recall": 1.0,
"Specificity": 0.9926,
"F1 score": 0.9677
},
"yilaguan": {
"Precision": 1.0,
"Recall": 0.9333,
"Specificity": 1.0,
"F1 score": 0.9655
},
"yinliaoping": {
"Precision": 1.0,
"Recall": 0.9667,
"Specificity": 1.0,
"F1 score": 0.9831
},
"mean precision": 0.97136,
"mean recall": 0.97,
"mean specificity": 0.99667,
"mean f1 score": 0.96997
}
复制代码
训练集和测试集的混淆矩阵:
2.4 推理
推理是指没有标签,只有图片数据的环境下对数据的预测,这里直接运行predict脚本即可
必要把待推理的数据放在
inference/img
下
推理结果:
3. 项目下载
关于本项目代码和数据集、训练结果的下载:
计算机视觉项目:DenseNet卷积神经网络网络【121,161,169,201四种版本】实现的自适应迁徙学习、图像识别项目:10种生存中常见垃圾图像分类资源-CSDN文库
关于计算机视觉实战可以继续关注本专栏,会持续更新图像分类和医学图像分割项目
关于图像分类和语义分割的改进:改进系列_Ai 医学图像分割的博客-CSDN博客
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4