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

这篇具有很好参考价值的文章主要介绍了CNN 卷积神经网络之 DenseNet 网络的分类统一项目(包含自定义数据集的获取)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. DenseNet 网络介绍

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

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

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

CNN 卷积神经网络之 DenseNet 网络的分类统一项目(包含自定义数据集的获取),图像分类,分类,数据挖掘,人工智能,神经网络,深度学习

1.1 卷积的简单介绍

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

CNN 卷积神经网络之 DenseNet 网络的分类统一项目(包含自定义数据集的获取),图像分类,分类,数据挖掘,人工智能,神经网络,深度学习

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

CNN 卷积神经网络之 DenseNet 网络的分类统一项目(包含自定义数据集的获取),图像分类,分类,数据挖掘,人工智能,神经网络,深度学习

这里定义两个名词:

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

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

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

CNN 卷积神经网络之 DenseNet 网络的分类统一项目(包含自定义数据集的获取),图像分类,分类,数据挖掘,人工智能,神经网络,深度学习

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

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

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

CNN 卷积神经网络之 DenseNet 网络的分类统一项目(包含自定义数据集的获取),图像分类,分类,数据挖掘,人工智能,神经网络,深度学习

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

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

1.2 网络加宽、加深的危害

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

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

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

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

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

1.3 ResNet 和 DenseNet 

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

CNN 卷积神经网络之 DenseNet 网络的分类统一项目(包含自定义数据集的获取),图像分类,分类,数据挖掘,人工智能,神经网络,深度学习

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

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

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

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

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

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

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

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

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

CNN 卷积神经网络之 DenseNet 网络的分类统一项目(包含自定义数据集的获取),图像分类,分类,数据挖掘,人工智能,神经网络,深度学习

2. DenseNet 网络的使用

代码就不解释了

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

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

CNN 卷积神经网络之 DenseNet 网络的分类统一项目(包含自定义数据集的获取),图像分类,分类,数据挖掘,人工智能,神经网络,深度学习

结果展示:

CNN 卷积神经网络之 DenseNet 网络的分类统一项目(包含自定义数据集的获取),图像分类,分类,数据挖掘,人工智能,神经网络,深度学习

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

训练过程展示:

CNN 卷积神经网络之 DenseNet 网络的分类统一项目(包含自定义数据集的获取),图像分类,分类,数据挖掘,人工智能,神经网络,深度学习

混淆矩阵:

CNN 卷积神经网络之 DenseNet 网络的分类统一项目(包含自定义数据集的获取),图像分类,分类,数据挖掘,人工智能,神经网络,深度学习

CNN 卷积神经网络之 DenseNet 网络的分类统一项目(包含自定义数据集的获取),图像分类,分类,数据挖掘,人工智能,神经网络,深度学习

训练的超参数更改:

    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文件

CNN 卷积神经网络之 DenseNet 网络的分类统一项目(包含自定义数据集的获取),图像分类,分类,数据挖掘,人工智能,神经网络,深度学习

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下的子文件夹改成自己数据集的名称即可

CNN 卷积神经网络之 DenseNet 网络的分类统一项目(包含自定义数据集的获取),图像分类,分类,数据挖掘,人工智能,神经网络,深度学习

3.3 爬取图片

展示如下:

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

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

CNN 卷积神经网络之 DenseNet 网络的分类统一项目(包含自定义数据集的获取),图像分类,分类,数据挖掘,人工智能,神经网络,深度学习

这里对明星分类展示:

CNN 卷积神经网络之 DenseNet 网络的分类统一项目(包含自定义数据集的获取),图像分类,分类,数据挖掘,人工智能,神经网络,深度学习

CNN 卷积神经网络之 DenseNet 网络的分类统一项目(包含自定义数据集的获取),图像分类,分类,数据挖掘,人工智能,神经网络,深度学习

CNN 卷积神经网络之 DenseNet 网络的分类统一项目(包含自定义数据集的获取),图像分类,分类,数据挖掘,人工智能,神经网络,深度学习

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

4. 链接

详细信息看 README 文件

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

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

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

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

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

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

到了这里,关于CNN 卷积神经网络之 DenseNet 网络的分类统一项目(包含自定义数据集的获取)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 什么是 CNN? 卷积神经网络? 怎么用 CNN 进行分类?(1)

    先看卷积是啥,url: https://www.bilibili.com/video/BV1JX4y1K7Dr/?spm_id_from=333.337.search-card.all.clickvd_source=7a1a0bc74158c6993c7355c5490fc600 下面这个式子就是卷积 看完了,感觉似懂非懂 下一个参考视频:https://www.youtube.com/watch?v=E5Z7FQp7AQQlist=PLuhqtP7jdD8CD6rOWy20INGM44kULvrHu 视频1:简单介绍卷积神经网络

    2024年02月08日
    浏览(47)
  • 基于卷积神经网络CNN的图片分类实现——附代码

    目录 摘要: 1.卷积神经网络介绍: 2.卷积神经网络(CNN)构建与训练: 2.1 CNN的输入图像 2.2 构建CNN网络 2.3 训练CNN网络 3.卷积神经网络(CNN)的实际分类测试: 4.本文Matlab实验代码: 使用Matlab自带的深度学习工具箱构建卷积神经网络(CNN)进行图片分类,以识别并分类手写

    2024年02月02日
    浏览(49)
  • Python基于深度学习机器学习卷积神经网络实现垃圾分类垃圾识别系统(GoogLeNet,Resnet,DenseNet,MobileNet,EfficientNet,Shufflent)

    文章目录 1 前言+ 2 卷积神经网络(CNN)详解+ 2.1 CNN架构概述+ 2.1.1 卷积层+ 2.1.2 池化层+ 2.1.3 全连接层 2.2 CNN训练过程+ 2.3 CNN在垃圾图片分类中的应用 3 代码详解+ 3.1 导入必要的库+ 3.2 加载数据集+ 3.3 可视化随机样本+ 3.4 数据预处理与生成器+ 3.5 构建、编译和训练CNN模型+ 3.5.

    2024年02月04日
    浏览(53)
  • 【机器学习】基于卷积神经网络 CNN 的猫狗分类问题

    卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),是深度学习(deep learning)的代表算法之一。 顾名思义,就是将卷积与前馈神经网络结合,所衍生出来的一种深度学习算法。 卷积神经网络CNN的结构图

    2024年02月17日
    浏览(46)
  • 文本分类系统Python,基于深度学习CNN卷积神经网络

    文本分类系统,使用Python作为主要开发语言,通过TensorFlow搭建CNN卷积神经网络对十余种不同种类的文本数据集进行训练,最后得到一个h5格式的本地模型文件,然后采用Django开发网页界面,实现用户在界面中输入一段文字,识别其所属的文本种类。 在我们的日常生活和工作中

    2024年02月08日
    浏览(56)
  • Python基于PyTorch实现卷积神经网络分类模型(CNN分类算法)项目实战

    说明:这是一个机器学习实战项目(附带 数据+代码+文档+视频讲解 ),如需 数据+代码+文档+视频讲解 可以直接到文章最后获取。 卷积神经网络,简称为卷积网络,与普通神经网络的区别是它的卷积层内的神经元只覆盖输入特征局部范围的单元,具有稀疏连接(sparse connec

    2024年02月15日
    浏览(51)
  • 机器学习实验4——CNN卷积神经网络分类Minst数据集

    基于手写minst数据集,完成关于卷积网络CNN的模型训练、测试与评估。 卷积层 通过使用一组可学习的滤波器(也称为卷积核)对输入图像进行滑动窗口卷积操作,这样可以提取出不同位置的局部特征,从而捕捉到图像的空间结构信息。 激活函数 在卷积层之后,通常会应用一

    2024年01月24日
    浏览(53)
  • 【Pytorch】计算机视觉项目——卷积神经网络CNN模型识别图像分类

    在上一篇笔记《【Pytorch】整体工作流程代码详解(新手入门)》中介绍了Pytorch的整体工作流程,本文继续说明如何使用Pytorch搭建卷积神经网络(CNN模型)来给图像分类。 其他相关文章: 深度学习入门笔记:总结了一些神经网络的基础概念。 TensorFlow专栏:《计算机视觉入门

    2024年02月05日
    浏览(57)
  • 卷积神经网络CNN原理+代码(pytorch实现MNIST集手写数字分类任务)

    前言 若将图像数据输入全连接层,可能会导致丧失一些位置信息 卷积神经网络将图像按照原有的空间结构保存,不会丧失位置信息。 卷积运算: 1.以单通道为例: 将将input中选中的部分与kernel进行数乘 : 以上图为例对应元素相乘结果为211,并将结果填入output矩阵的左上角

    2024年02月04日
    浏览(63)
  • Python实现ACO蚁群优化算法优化卷积神经网络分类模型(CNN分类算法)项目实战

    说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取。 蚁群优化算法(Ant Colony Optimization, ACO)是一种源于大自然生物世界的新的仿生进化算法,由意大利学者M. Dorigo, V. Maniezzo和A.Colorni等人于20世纪90年代初

    2024年02月06日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包