CNN 卷积神经网络之 DenseNet 网络的分类统一项目(包含自定义数据集的获取)

1. DenseNet 网络介绍

本章实现的项目是DenseNet 网络对花数据集的五分类,下载链接:

基于迁移学习的 DenseNet 图像分类项目

DenseNet 网络是在 ResNet 网络上的改进,大概的网络结构如下:

1.1 卷积的简单介绍

图像识别任务主要利用神经网络对图像进行特征提取,最后通过全连接层将特征和分类个数进行映射。传统的网络是利用线性网络对图像进行分类,然而图像信息是二维的,一般来说,图像像素点和周围邻域像素点相关。而线性分类网络将图像强行展平成一维,不仅仅忽略了图像的空间信息,而全连接层会大大增加网络的参数

为了更好把握图像像素的空间信息,提出了 CNN 卷积神经网络,利用卷积核(滤波器)对图像进行窗口化类似处理,这样可以更好的把握图像的空间信息。

这里定义两个名词:

1. 空间信息是指图像的宽高

2. 语义信息是类似手、脚一类图像本身具体的信息,神经网络中在 channel 中表现

CNN 卷积神经网络一般处理流程,将图像的宽高缩减,增加图像的channel 信息。这是因为我们往往更在乎图像的语义信息,所以正常神经网络都是将图像 size 缩半,channel 翻倍,一个通道提取一个语义,尺寸缩半是因为最大池化层之类的操作,可以增加网络的抗干扰能力。例如经典的VGG 网络就是每一层特征图size减半,channel 翻倍

如果想要提取更多的语义信息,就代表 channel 要更多

而网络的层数代表语义的高低之分,加入第一层可以每个channel 提取耳朵、鼻子。那么网络层数越深,提取的语义更高级,例如第二层每个channel 提取到狗的鼻子、猫的耳朵。所以,网络层数的多少代表能提取多么 "高级" 的语义信息

例如下图:浅层特征图提取的是边缘信息,深层的特征图可能是汽车的车牌啊、车轮啊啥的

网络的加宽,代表增加 channel 个数,提取更多特征

网络的加深,代表增加网络层数,提取更高级的语义信息 

1.2 网络加宽、加深的危害

那么网络是不是越深越好?或者说网络宽度,channel 个数是不是越多越好?

答案是否定的,要不然早就有统一的网络可以实现图像识别的统一

网络层数越多、通道越多,网络会很繁重,参数的增多代表每次运行需要计算的量越大。虽然现在硬件的发展这点的影响越来越低,不过我们还是强调网络参数的多少 

除了计算量大外,网络训练需要反向传播(矩阵反向传播:聊聊关于矩阵反向传播的梯度计算、从零实现反向传播:手动完成反向传播的多层线性网络对sin的回归)

反向传播每次的梯度发生一点改变,在更深的网络中会发生雪崩效应。例如1.2 好多层乘在一起,数字会越来愈大,如果0.2的话,好多层乘在一起,梯度几乎就变成0了,参数没法训练,网络也失去了意义,更多说还要乘更小的学习率了。前者叫梯度爆炸,后者叫梯度消失

1.3 ResNet 和 DenseNet 

为了解决梯度爆炸或者梯度消失的问题,resnet 提出了resnet残差块结构,如下:

ResNet 中提出了 shortcut 结构,将上层的特征和本层特征融合,这样上层提取的浅层语义信息和高维的语义信息相加。这样网络理论上可以叠加的无限深!

关于网络层数的加深,这里有两种解释:

  1. 浅层的语义信息和高纬度的信息一直叠加,这样但凡网络有无限层,哪怕图像的语义信息已经没有全是0了,这样低维度的信息还在(例如浅层语义信息为1,高纬度的语义信息没有,为0,这样1+0=0,还是可以保存浅层的信息),哪怕后续的层数全被浪费掉,浅层的信息还在不是吗?
  2. 因为shortcut 结构的存在,反向梯度的传播可以不用乘上很小的梯度,直接反向传递到上一层,这样梯度消失的问题也解决了,所以网络理论上可以增加无限深

有些人任务resnet 的成功就是 shortcut 的存在让网络可以成功反向传播,让网络可以训练的 "动"

不过,本人觉得第一种可以更好解释resnet为什么可以提取到更好的特征,也可以解释为什么resnet 的效果如此优越

OK,网络的加深的问题解决了,那么网络的宽度,也就是卷积核的个数如何设定?

这样没有标准,所以不少消融试验就是验证不同 channel 个数来找到最好的参数设定

那么如果不仅仅融合上一层的信息,而是将前面浅层全部融合会怎么样呢?

这就是DenseNet 的由来,密集连接

2. DenseNet 网络的使用

代码就不解释了

本章是DenseNet 网络对于数据集花的五分类:基于迁移学习的 DenseNet 图像分类项目

代码的使用很简单,只需要将数据集按照如下摆放即可,不需要更改任何参数。例如train和predict 中的分类个数啊,代码会自动生成,并且类别标签的 json 文件也会自动生成

结果展示:

可以看到,迁移学习下,精度达到了0.9 左右,比之前的resnet还是高很多的

训练过程展示:

混淆矩阵:

训练的超参数更改:

    parser.add_argument('--epochs', type=int, default=100)parser.add_argument('--batch-size', type=int, default=32)parser.add_argument('--lr', type=float, default=0.01)parser.add_argument('--lrf', type=float, default=0.01)parser.add_argument('--freeze-layers', type=bool, default=False)     # 是否冻结权重

关于项目的其他问题:详细见README文件

3.  关于数据集

项目的迁移,关于如何利用自定义数据集进行训练

3.1 图像损坏问题

因为有的图像损坏,代码会报警告,这里提供代码进行移除

注意,需要自己建立 corrupt_image 文件,和data在同一目录即可,代码会将data下损坏的图像移除,保存在  corrupt_image 文件中

from PIL import Image
import os
import shutil
import warnings     # 将图片损坏信息转为错误
warnings.filterwarnings("error", category=UserWarning)def main():# 训练集path = 'data/train'path_dir = [os.path.join(path, x) for x in os.listdir(path)]image_list = []       # 所有图片for i in path_dir:for j in os.listdir(i):image = os.path.join(i,j)image_list.append(image)for i in image_list:  # 遍历图片try:Image.open(i)except:print('corrupt img', i)shutil.move(i, 'corrupt_image')# 测试集path = 'data/test'path_dir = [os.path.join(path, x) for x in os.listdir(path)]image_list = []       # 所有图片for i in path_dir:for j in os.listdir(i):image = os.path.join(i,j)image_list.append(image)for i in image_list:  # 遍历图片try:Image.open(i)except IOError:print('corrupt img', i)shutil.move(i, 'corrupt_image')if __name__ == '__main__':main()

3.2 划分好的数据集

只需要按照下述摆放即可,文件名不可更改!!只需要将train或者test下的子文件夹改成自己数据集的名称即可

3.3 爬取图片

展示如下:

选中 Baidu API ,将keywords 改成想要下载的就行,Max number为下载个数,Threads 最好设定小一点,否则可能会下载数目不到Max number

代码会自动在该目录下生成 Keywords 目录,下面是 Max number 个Keywords 图像

这里对明星分类展示:

额,老薛好像分类错了....

4. 链接

详细信息看 README 文件

如果只想单纯的跑通DenseNet 网络,下载这个:基于迁移学习的 DenseNet 图像分类项目

如果没有数据集,需要脚本抓取网络关键词图像,看这个:python 项目:利用爬虫抓取特定关键字图片代码,可以用作深度学习图像分类的数据集

如果已经用了数据集,且按照文件夹摆放好,但不知道图像是否损坏,看这个:

DenseNet 对网络爬取的数据集进行分类,包含对图片是否损坏的检测

如果什么都没有,想自己搞个分类网络玩玩,看这个:DenseNet 网络对自定义数据集的训练(从网络download图片开始到划分训练集+测试集,再到网络训练的完整项目)

这个只需要在UI窗口输入关键词即可,脚本会自动抓取网络图片。因为中文爬取的效果好,只需要将文件夹重新改为英文即可,图像是否损坏啊,数据集划分啊,数据集摆放啊,代码会一键运行。至于分类个数,train、predict 脚本是否更改都是完全不需要的,代码会自动生成!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/219828.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BearPi Std 板从入门到放弃 - 先天神魂篇(3)(RT-Thread I2C设备)

简介 使用BearPi IOT Std开发板及其扩展板E53_SC1, SC1上有I2C1 的光照强度传感器BH1750 和 EEPROM AT24C02, 本次主要就是读取光照强度; 主板: 主芯片: STM32L431RCT6LED : PC13 \ 推挽输出\ 高电平点亮串口: Usart1I2C使用 : I2C1E53_SC1扩展板 : LE…

蓝牙物联网全屋智能系统解决方案

#蓝牙物联网# 蓝牙物联网全屋智能系统解决方案是一种通过低功耗蓝牙技术将家中的各种设备连接到一起,实现家居物联智能操控的方案。 全屋智能系统解决方案是一种将智能家居设备、传感器、照明、安防等系统集成在一起,实现全屋智能化控制的方案。 蓝牙物…

Excel: Python 如何干掉 VBA 系列 乙

以下内容为本人的学习笔记,如需要转载,请声明原文链接 微信公众号「ENG八戒」https://mp.weixin.qq.com/s/k2XtfXS3GUt4r2QhizMOVg 创建工作表格 创建表格 xlwings 就可以协助创建插入了宏的 excel 表格。 先找到一个心满意足的目录,一般我…

webpack详细教程

1,什么是webpackwebpack | webpack中文文档 | webpack中文网 Webpack 不仅是一个模块打包器(bundler),更完整的讲是一个前端自动化构建工具。在 Webpack 看来前端的所有资源文件(s/json/css/img/less/...)都会作为横块处理它将根据模块的依赖关系进行静…

mysql数据库相关知识【MYSQL】

mysql数据库相关知识【MYSQL】 一. 库1.1 登录数据库管理系统1.2 什么是数据库1.2.1 mysqld与mysql 1.3 编码集和校验集1.3.1 什么是编码集和校验集1.3.2 查看库对应的编码集和校验集1.3.3 用指定的编码集和校验集 1.4 库的操作 一. 库 1.1 登录数据库管理系统 这个算是第一个…

节流防抖:提升前端性能的秘密武器(下)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

浅谈基于深度学习的手写体纸质文档识别OCR软件

引言: 随着数字化时代的到来,纸质文档的电子化需求越来越强烈。在众多的OCR(Optical Character Recognition)软件中,基于深度学习的手写体纸质文档识别OCR软件成为了关注焦点。本文将探讨这种软件的特点、功能以及应用…

基于SSM架构的超市管理系统设计

基于SSM架构的超市管理系统设计 目录 基于SSM架构的超市管理系统设计 1 环境及工具1.1 IDEA软件安装1.2 JDK环境配置1.3 MySQL数据库安装1.3.1常规情况1.3.2非常规情况 1.4 Tomcat安装 2 部署与设计2.1 数据库信息创建2.2项目创建与部署 3 相关说明4 功能操作说明4.1 管理员操作…

互联网加竞赛 python opencv 深度学习 指纹识别算法实现

1 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 python opencv 深度学习 指纹识别算法实现 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分工作量:4分创新点:4分 该项目较为新颖…

SE考研真题总结(三)

继续更新,今天准备连出两期该系列~ SE考研真题总结(二)https://blog.csdn.net/jsl123x/article/details/134857052?spm1001.2014.3001.5501 目录 一.简答题 二.代码大题 一.简答题 1.工程和科学的区别 科学是关于事物的基本原理和事实的…

计算4*4*4空间中2点结构的分布

不考虑两点距离的情况下,3维空间中的两点最多只有7种位置关系。3条边,3条面对角线,1条体对角线。现在向4*4*4的3维空间中随机的扔2个石子,比较7种结构的占比。 得到表格为 1 96 0.0476 2 96 0.0476 3 288 0.1429 4 288 …

【ARM Trace32(劳特巴赫) 使用介绍 6 -- 通用寄存器查看与修改】

请阅读【Trace32 ARM 专栏导读】 文章目录 通用寄存器查看与修改Rester 命令语法Register.InitRegister.RELOAD高亮显示Register变化的值多核寄存器显示设置寄存器的值修改 通用寄存器查看与修改 在使用Trace32进行调试时,有时候需要查看并修改通用寄存器、PC指针、…

使用ffmpeg命令进行视频格式转换

1 ffmpeg介绍 FFmpeg 是一个非常强大和灵活的开源工具集,用于处理音频和视频文件。它提供了一系列的工具和库,可以用于录制、转换、流式传输和播放音频和视频。 FFmpeg 主要特点如下: 格式支持广泛:FFmpeg 支持几乎所有的音频和视…

ARM开发基础知识

1、ARM寄存器 概念:寄存器是处理器内部的存储器,没有地址 作用:一般用于暂时存储参与运算的数据和运算结果 分类:通用寄存器、专用寄存器、状态寄存器 注意:有标签(带三角光标)的是独有的寄存器…

Caché/M 数据库上面的那个 é 怎么打

Cach/M 数据库名字上的 e 有一撇,这个 e 是法语字符,通常英语键盘还不是那么好打。 因最近在研究这个数据库,所以这个字符会用得比较多,简单点的方法就是直接用 e 代替,并且后面加个斜杆 M 用于区分英文的 Cache。 拷…

几本学习中整理和面试的PDF,以及精选面试资料

今天和大家分享我在学习过程中整理的笔记,以及我在准备面试中,阅读的PDF,包括Spring Cloud学习手册、Docker学习手册、RabbitMQ学习手册、Spring 6手册、Maven手册、22w字面试手册等等,包括了大部分后端技术以及大部分高频面试题&…

计算机网络应用层(期末、考研)

计算机网络总复习链接🔗 目录 DNS域名服务器域名解析过程分类递归查询(给根域名服务器造成的负载过大,实际中几乎不用)迭代查询 域名缓存(了解即可)完整域名解析过程采用UDP服务 FTP控制连接与数据连接 电…

C# 从代码入门 Mysql 数据库事务

在业务开发中,使用数据库事务是必不可少的。而开发中往往会使用各种 ORM 执行数据库操作,简化代码复杂度,不过,由于各种 ORM 的封装特性,开发者的使用方式也不一样,开发者想要了解 ORM 对事务做了什么处理是…

redis-学习笔记(Jedis 通用命令)

flushAll 清空全部的数据库数据 jedis.flushAll();set & get set 命令 get 命令 运行结果展示 exists 判断该 key 值是否存在 当 redis 中存在该键值对时, 返回 true 如果键值对不存在, 返回 false keys 获取所有的 key 值 参数是模式匹配 *代表匹配任意个字符 _代表匹配一…

WWW 指南-万维网联盟(World Wide Web)

WWW - 万维网联盟 WWW通常称为网络。 web是一个世界各地的计算机网络。 电脑在Web上使用标准语言沟通。 万维网联盟(W3C)制定了Web标准 什么是WWW? WWW 代表 World Wide Web(万维网)万维网常常被称为 网络网络是世界各地的计算机网络网络中…