卷积神经网络(CNN)详细介绍及其原理详解

news2024/11/18 15:30:21

文章目录

  • 前言
  • 一、什么是卷积神经网络
  • 二、输入层
  • 三、卷积层
  • 四、池化层
  • 五、全连接层
  • 六、输出层
  • 七、回顾整个过程
  • 总结

前言

  本文总结了关于卷积神经网络(CNN)的一些基础的概念,并且对于其中的细节进行了详细的原理讲解,通过此文可以十分全面的了解卷积神经网络(CNN),非常适合于作为Deep Learning的入门学习。下面就是本篇博客的全部内容!


一、什么是卷积神经网络

  卷积神经网络(Convolutional Neural Networks, CNN)这个概念的提出可以追溯到二十世纪80~90年代,但是有那么一段时间这个概念被“雪藏”了,因为当时的硬件和软件技术比较落后,而随着各种深度学习理论相继被提出以及数值计算设备的高速发展,卷积神经网络得到了快速发展。那究竟什么是卷积神经网络呢?以手写数字识别为例,整个识别的过程如下所示:

请添加图片描述

图1:手写数字识别过程

  以上过程就是识别手写数字的全部过程,这个项目我之前也写过相关博客并开源了代码,感兴趣的同学可查阅: 基于CNN的MINIST手写数字识别项目代码以及原理详解。话说回来,可以看到整个过程需要在如下几层进行运算:

  • 输入层:输入图像等信息
  • 卷积层:用来提取图像的底层特征
  • 池化层:防止过拟合,将数据维度减小
  • 全连接层:汇总卷积层和池化层得到的图像的底层特征和信息
  • 输出层:根据全连接层的信息得到概率最大的结果

  可以看到其中最重要的一层就是卷积层,这也是卷积神经网络名称的由来,下面将会详细讲解这几层的相关内容。

二、输入层

  输入层比较简单,这一层的主要工作就是输入图像等信息,因为卷积神经网络主要处理的是图像相关的内容,但是我们人眼看到的图像和计算机处理的图像是一样的么?很明显是不一样的,对于输入图像,首先要将其转换为对应的二维矩阵,这个二位矩阵就是由图像每一个像素的像素值大小组成的,我们可以看一个例子,如下图所示的手写数字“8”的图像,计算机读取后是以像素值大小组成的二维矩阵存储的图像。

请添加图片描述

图2:数字8的灰度图像与其对应的二维矩阵

  上图又称为灰度图像,因为其每一个像素值的范围是0~255(由纯黑色到纯白色),表示其颜色强弱程度。另外还有黑白图像,每个像素值要么是0(表示纯黑色),要么是255(表示纯白色)。我们日常生活中最常见的就是RGB图像,有三个通道,分别是红色、绿色、蓝色。每个通道的每个像素值的范围也是0~255,表示其每个像素的颜色强弱。但是我们日常处理的基本都是灰度图像,因为比较好操作(值范围较小,颜色较单一),有些RGB图像在输入给神经网络之前也被转化为灰度图像,也是为了方便计算,否则三个通道的像素一起处理计算量非常大。当然,随着计算机性能的高速发展,现在有些神经网络也可以处理三通道的RGB图像。

  现在我们已经知道了,输入层的作用就是将图像转换为其对应的由像素值构成的二维矩阵,并将此二维矩阵存储,等待后面几层的操作。

三、卷积层

  那图片输入进来之后该怎么处理呢?假设我们已经得到图片的二维矩阵了,想要提取其中特征,那么卷积操作就会为存在特征的区域确定一个高值,否则确定一个低值。这个过程需要通过计算其与卷积核(Convolution Kernel)的乘积值来确定。假设我们现在的输入图片是一个人的脑袋,而人的眼睛是我们需要提取的特征,那么我们就将人的眼睛作为卷积核,通过在人的脑袋的图片上移动来确定哪里是眼睛,这个过程如下所示:

请添加图片描述

图3:提取人的眼睛的特征的过程

  通过整个卷积过程又得到一个新的二维矩阵,此二维矩阵也被称为特征图(Feature Map),最后我们可以将得到的特征图进行上色处理(我只是打个比方,比如高值为白色,低值为黑色),最后可以提取到关于人的眼睛的特征,如下所示:

请添加图片描述

图4:提取人的眼睛的特征的结果

  看着上面的描述可能有点懵,别急,首先卷积核也是一个二维矩阵,当然这个二维矩阵要比输入图像的二维矩阵要小或相等,卷积核通过在输入图像的二维矩阵上不停的移动,每一次移动都进行一次乘积的求和,作为此位置的值,这个过程如下图所示:

请添加图片描述

图5:卷积的过程

  可以看到,整个过程就是一个降维的过程,通过卷积核的不停移动计算,可以提取图像中最有用的特征。我们通常将卷积核计算得到的新的二维矩阵称为特征图,比如上方动图中,下方移动的深蓝色正方形就是卷积核,上方不动的青色正方形就是特征图。

  有的读者可能注意到,每次卷积核移动的时候中间位置都被计算了,而输入图像二维矩阵的边缘却只计算了一次,会不会导致计算的结果不准确呢?

  让我们仔细思考,如果每次计算的时候,边缘只被计算一次,而中间被多次计算,那么得到的特征图也会丢失边缘特征,最终会导致特征提取不准确,那为了解决这个问题,我们可以在原始的输入图像的二维矩阵周围再拓展一圈或者几圈,这样每个位置都可以被公平的计算到了,也就不会丢失任何特征,此过程可见下面两种情况,这种通过拓展解决特征丢失的方法又被称为Padding。

  • Padding取值为1,拓展一圈

请添加图片描述

图6:Padding为1时卷积的过程
  • Padding取值为2,拓展两圈

请添加图片描述

图7:Padding为2时卷积的过程

  那如果情况再复杂一些呢?如果我们使用两个卷积核去提取一张彩色图片呢?之前我们介绍过,彩色图片都是三个通道,也就是说一个彩色图片会有三个二维矩阵,当然,我们仅以第一个通道示例,否则太多了也不好介绍。此时我们使用两组卷积核,每组卷积核都用来提取自己通道的二维矩阵的特征,刚才说了,我们只考虑第一通道的,所以说我们只需要用两组卷积核的第一个卷积核来计算得到特征图就可以了,那么这个过程可见下图

请添加图片描述

图8:两个卷积核进行卷积的过程

  看着上面的动图确实有些不知所措是吧,我来解释一下,按照刚才的思路,输入图片是彩色图片,有三个通道,所以输入图片的尺寸就是7×7×3,而我们只考虑第一个通道,也就是从第一个7×7的二维矩阵中提取特征,那么我们只需要使用每组卷积核的第一个卷积核即可,这里可能有读者会注意到Bias,其实它就是偏置项,最后计算的结果加上它就可以了,最终通过计算就可以得到特征图了。可以发现,有几个卷积核就有几个特征图,因为我们现在只使用了两个卷积核,所以会得到两个特征图。

  以上就是关于卷积层的一些相关知识,当然,本文也只是一个入门,所以说还有一些比较复杂的内容没有进行深入阐述,这个就需要等到过后的学习与总结了。

四、池化层

  刚才我们也提到了,有几个卷积核就有多少个特征图,现实中情况肯定更为复杂,也就会有更多的卷积核,那么就会有更多的特征图,当特征图非常多的时候,意味着我们得到的特征也非常多,但是这么多特征都是我们所需要的么?显然不是,其实有很多特征我们是不需要的,而这些多余的特征通常会给我们带来如下两个问题:

  • 过拟合
  • 维度过高

  为了解决这个问题,我们可以利用池化层,那什么是池化层呢?池化层又称为下采样,也就是说,当我们进行卷积操作后,再将得到的特征图进行特征提取,将其中最具有代表性的特征提取出来,可以起到减小过拟合和降低维度的作用,这个过程如下所示:

请添加图片描述

图9:池化的过程

  那有的读者可能会问了,我应该以什么规则进行特征提取呢?其实这个过程类似于卷积的过程,就是一个正方形的小方块在图片上进行移动,每次我们取这个正方形方框中最具有代表性的特征,那么问题又来了,如何提取到最有代表性的特征呢,通常有两种方法:

  • 最大池化

    顾名思义,最大池化就是每次取正方形中所有值的最大值,这个最大值也就相当于当前位置最具有代表性的特征,这个过程如下所示:

请添加图片描述

图10:最大池化的过程

      这里有几个参数需要说明一下:
      ① kernel_size = 2:池化过程使用的正方形尺寸是2×2,如果是在卷积的过程中就说明卷积核的大小是2×2
      ② stride = 2:每次正方形移动两个位置(从左到右,从上到下),这个过程其实和卷积的操作过程一样
      ③ padding = 0:这个之前介绍过,如果此值为0,说明没有进行拓展

  • 平均池化

    平均池化就是取此正方形区域中所有值的平均值,考虑到每个位置的值对于此处特征的影响,平均池化计算也比较简单,整个过程如下图所示:

请添加图片描述

图11:平均池化的过程

  对于其中的参数含义与上面介绍的最大池化一致,另外,需要注意计算平均池化时采用向上取整。

  以上就是关于池化层的所有操作,我们再回顾一下,经过池化后,我们可以提取到更有代表性的特征,同时还减少了不必要的计算,这对于我们现实中的神经网络计算大有脾益,因为现实情况中神经网络非常大,而经过池化层后,就可以明显的提高模型的效率。所以说,池化层的好处很多,将其优点总结如下:

  • 在减少参数量的同时,还保留了原图像的原始特征

  • 有效防止过拟合

  • 为卷积神经网络带来平移不变性

    以上两个优点我们之前已经介绍过了,那什么又是平移不变性呢?可以用我们之前的一个例子,如下图所示:

请添加图片描述

图12:池化的平移不变性

  可以看到,两张原始图片的位置有所不同,一个是正常的,另一个是人的脑袋稍稍左移了一些,经过卷积操作后,得到各自对应的特征图,这两张特征图也和原始图片的位置相对应,一个眼睛特征的位置是正常的,另一个眼睛特征的位置稍稍左移了一些,虽然人可以分辨,但是经过神经网络计算后,就可能带来误差,因为应该出现眼睛的位置并没有出现眼睛,那应该怎么办呢?此时使用池化层进行池化操作,可以发现,虽然池化之前两幅图片的眼睛特征不在一个位置,但是经过池化之后,眼睛特征的位置都是相同的,这就为后续神经网络的计算带来了方便,此性质就是池化的平移不变性

五、全连接层

  假设还是上面人的脑袋的示例,现在我们已经通过卷积和池化提取到了这个人的眼睛、鼻子和嘴的特征,如果我想利用这些特征来识别这个图片是否是人的脑袋该怎么办呢?此时我们只需要将提取到的所有特征图进行“展平”,将其维度变为 1 × x 1×x 1×x,这个过程就是全连接的过程,也就是说,此步我们将所有的特征都展开并进行运算,最后会得到一个概率值,这个概率值就是输入图片是否是人的概率,这个过程如下所示:

请添加图片描述

图13:全连接的过程

  单看这个过程可能还是不太清晰,所以我们可以把之前的过程与全连接层结合起来,如下图所示:

请添加图片描述

图14:整个过程

  可以看到,经过两次卷积和最大池化之后,得到最后的特征图,此时的特征都是经过计算后得到的,所以代表性比较强,最后经过全连接层,展开为一维的向量,再经过一次计算后,得到最终的识别概率,这就是卷积神经网络的整个过程。

六、输出层

  卷积神经网络的输出层理解起来就比较简单了,我们只需要将全连接层得到的一维向量经过计算后得到识别值的一个概率,当然,这个计算可能是线性的,也可能是非线性的。在深度学习中,我们需要识别的结果一般都是多分类的,所以每个位置都会有一个概率值,代表识别为当前值的概率,取最大的概率值,就是最终的识别结果。在训练的过程中,可以通过不断地调整参数值来使识别结果更准确,从而达到最高的模型准确率。

请添加图片描述

图15:输出层示意图

七、回顾整个过程

  卷积神经网络最经典的应用莫过于手写数字识别了,比如我现在手写一个数字8,那么卷积神经网络是如何识别出来的呢?整个识别的过程如下图所示:

请添加图片描述

图16:手写数字识别的过程
  1. 将手写数字图片转换为像素矩阵
  2. 对像素矩阵进行Padding不为0的卷积运算,目的是保留边缘特征,生成一个特征图
  3. 对这个特征图使用六个卷积核进行卷积运算,得到六个特征图
  4. 对每个特征图进行池化操作(也可称为下采样操作),在保留特征的同时缩小数据流,生成六个小图,这六个小图和上一层各自的特征图长得很像,但尺寸缩小了
  5. 对池化操作后得到的六个小图进行第二次卷积运算,生成了更多的特征图
  6. 对第二次卷积生成的特征图进行池化操作(下采样操作)
  7. 将第二次池化操作得到的特征进行第一次全连接
  8. 将第一次全连接的结果进行第二次全连接
  9. 将第二次全链接的结果进行最后一次运算,这种运算可能是线性的也可能是非线性的,最终每个位置(一共十个位置,从0到9)都有一个概率值,这个概率值就是将输入的手写数字识别为当前位置数字的概率,最后以概率最大的位置的值作为识别结果。可以看到,右侧上方是我的手写数字,右侧下方是模型(LeNet)的识别结果,最终的识别结果与我输入的手写数字是一致的,这一点从图片左边最上边也可以看到,说明此模型可以成功识别手写数字

总结

  以上就是本篇博客的全部内容了,可以看到内容写的非常充实,也耗费了我不少时间来总结,希望可以和大家一起学习、进步。另外,由于本人水平有限,有错的地方还望读者指正,谢谢大家!下篇博客见!

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

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

相关文章

自动(智能)驾驶 | 4D雷达的数据集

上篇文章分享了关于Oculii 4D雷达的两篇报告。数据集是一个非常重要的研究工具,对于4D雷达领域来说,处于一个研究前沿的位置,鲜有公开的数据集,目前能找到的数据集有: 这些文章中的数据集有不少博主也写过&#xff0c…

S1000D规范导读

S1000D最初是由欧洲航空工业联盟开发的技术出版物规范,它主要为具有较长生命的复杂产品运行和维修而设计。这些年不断发展,已经扩展到这些行业的产品:国防系统 - 包括海、陆、空的产品,民用航空产品,基建行业产品和船舶…

15/365 java static final

1.static属性,方法 类内属性或方法用static修饰,表示该属性或方法属于类,不依赖于实例对象,所以不需要用对象调用,而是直接用类名调用。 static方法只能调用其他static方法,而普通方法可以调用其他的普通方法和stati…

Vue3商店后台管理系统设计文稿篇(二)

记录使用vscode构建Vue3商店后台管理系统,这是第二篇,主要记录Vue3中生命周期钩子,模板语法,以及相关的代码 文章目录一、Vue3生命周期二、Vue3模板语法三、代码展示正文内容: 一、Vue3生命周期 每个 Vue 实例在被创建…

拆机详解2:比Macintosh还早?苹果Lisa拆解

hello大家好,我是每天(实际并不是每天,你们点的赞太少了,每人点一个赞我就日更)给你们讲解的Eric_Bells.这里感谢博主半身风雪的支持,我会更新的!看到的麻烦点个关注谢谢拉 今天唠唠一台比Maci…

【蓝桥杯基础题】2017年省赛—九宫幻方

👑专栏内容:👉蓝桥杯刷题👈⛪个人主页:👉子夜的星的主页👈💕座右铭:前路未远,步履不停 目录一、题目背景二、题目描述1.问题描述2.输入格式3.输出格式4.一个例…

CAN通信----(创芯科技)CAN分析仪使用----CANTest安装和驱动安装

前言 我在调试CAN通信时,使用的是在淘宝买的CAN分析仪。 CAN分析仪的实物如下: 使用CAN分析仪,调试CAN通信,PC电脑端需要使用CANTest测试软件,还需要安装驱动。 一、创芯科技 CAN分析仪资料包下载 步骤1&#xff1…

测开-基础篇

一、软件测试的生命周期 先来回顾软件的生命周期 🍑软件的生命周期 需求分析--》计划--》设计--》编码--》测试--》运营维护 需求分析:进行市场分析,这个需求量大不大?投入与盈利的占比?技术上 能否实现或者说实现的…

深度学习 10 神经网络简介

1. 深度学习和机器学习的主要区别在于对数据的处理, 机器学习主要通过算法直接进行推断, 而深度学习主要通过神经网络对各种算法进行加权, 然后汇总得出结论. 2. 常用的激活函数: tanh函数relu函数leaky relu函数1.1 深度学习介绍 1.1.1 区别 机器学习的特征工程步骤是要靠手…

Effective Objective-C 2.0学习记录(五)

23.通过委托和数据源协议进行对象间通信 使用委托模式:获取网络数据的类含有一个“委托对象”,在获取完数据后,它会回调这个委托对象。 利用协议机制,很容易就 能以OC代码实现此模式,在图中演示的情况下。可以这样定义…

【Java AWT 图形界面编程】Container 容器总结

文章目录一、AWT 简介二、AWT 核心类继承体系三、Container 容器类子类四、Container 容器常用 API五、Frame 窗口示例六、Panel 示例七、窗口中文乱码处理八、ScrollPane 可滚动容器示例一、AWT 简介 Java 中 使用 AWT 和 Swing 进行 图形界面开发 , AWT 是 抽象窗口工具集 , …

线程安全问题(3)

线程不安全:在多线程的调度情况下,导致出现了一些随机性,随机性是代码中出现了一些BUG,导致我们的线程是不安全的 造成线程不安全的原因: 1)操作系统抢占式执行,线程调度随机,这是万恶之源,我们无能为力 2)…

Web进阶:Day7 响应式、BootStrap、实战演练

Web进阶:Day7 Date: January 10, 2023 Summary: 响应式、BootStrap、实战演练 响应式 媒体查询 目标:能够根据设备宽度的变化,设置差异化样式 媒体特性常用写法 媒体特性常用写法: max-width(从小到大&#xff0…

transformers包介绍——nlp界最顶级的包——可以不用 但不能不知道——python包推荐系列

背景1 现在在AI行业,什么最火?计算机视觉还是自然语言处理?其实不得不说,现在nlp很火。还有人记得上个月很多科技爱好者都在玩的chatgpt么?那个就是nlp技术的一大应用。现在都在觉得AI赚钱,工资高&#xf…

深度学习 12 正则化

1. 对于高方差(过拟合),有以下几种方式: 获取更多的数据,使得训练能够包含所有可能出现的情况 正则化(Regularization) 寻找更合适的网络结构 2. 对于高偏差(欠拟合),有以下几种方式: 扩大网…

【C语言进阶】只看此篇,让你学会动态内存管理

目录 前言 一、为什么存在动态内存分配 二、动态内存函数的介绍 1 、malloc和free 2、 calloc 3 、realloc 三、常见的动态内存错误 四、动态内存管理笔试题 1 题目1: 2 题目2: 3 题目3: 4 题目4: 五、C/C程序的…

5.10回溯法--圆排列问题--排列树

圆排列问题描述 给定n个大小不相等的圆,要将这n个大小不相等的圆排进一个矩形框中,且要求个个圆都与矩形框的最底边相切。要找出最小长度的圆排列。 问题分析 排列排列,解空间是一个排列树。 设开始时,a[n]储存n个圆的半径&…

笔试强训48天——day26

文章目录一. 单选1.在单处理器系统中,如果同时存在有12个进程,则处于就绪队列中的进程数量最多为()2.在系统内存中设置磁盘缓冲区的主要目的是()3.下列选项中,会导致进程从执行态变为就绪态的事…

时间复杂度空间复杂度

算法效率数据结构算法时间复杂度大O的渐进表示法三种时间复杂度几道例题一.简单递归二结合代码来判断时间复杂度空间复杂度我们程序猿开始的时候肯定听了不少的:数据结构和算法,那么阿涛就给大家说说自己的拙见吧.数据结构 数据结构就是我们用来组织数据的方式,比如我们可以把…

JVM-【面试题】-垃圾收集算法+垃圾收集器,以后就不用担心对象那些事了

一、垃圾收集算法在jvm里对可回收的对象在不同的垃圾收集器里,有不同的回收算法,具体的可以分为这四种:分代收集算法、复制算法、标记清除算法、标记整理算法1.1 分代收集算法当前虚拟机的垃圾收集都采用分代收集算法,这种算法没有…