一文让你彻底了解卷积神经网络

klausage klausage     2023-04-18     708

关键词:

卷积神经网络(Convolutional Neural Network,CNN)是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现。 它包括卷积层(convolutional layer)和池化层(pooling layer)。

对比:卷积神经网络、全连接神经网络

技术图片

左图:全连接神经网络(平面),组成:输入层、激活函数、全连接层

右图:卷积神经网络(立体),组成:输入层、卷积层、激活函数、池化层、全连接层

在卷积神经网络中有一个重要的概念:深度

卷积层

卷积:在原始的输入上进行特征的提取。特征提取简言之就是,在原始输入上一个小区域一个小区域进行特征的提取,稍后细致讲解卷积的计算过程。

技术图片

上图中,左方块是输入层,尺寸为32*32的3通道图像。右边的小方块是filter,尺寸为5*5,深度为3。将输入层划分为多个区域,用filter这个固定尺寸的助手,在输入层做运算,最终得到一个深度为1的特征图。

技术图片

上图中,展示出一般使用多个filter分别进行卷积,最终得到多个特征图。

技术图片

上图使用了6个filter分别卷积进行特征提取,最终得到6个特征图。将这6层叠在一起就得到了卷积层输出的结果。

技术图片

卷积不仅限于对原始输入的卷积。蓝色方块是在原始输入上进行卷积操作,使用了6个filter得到了6个提取特征图。绿色方块还能对蓝色方块进行卷积操作,使用了10个filter得到了10个特征图。每一个filter的深度必须与上一层输入的深度相等。

直观理解卷积

技术图片

以上图为例:

第一次卷积可以提取出低层次的特征。

第二次卷积可以提取出中层次的特征。

第三次卷积可以提取出高层次的特征。

特征是不断进行提取和压缩的,最终能得到比较高层次特征,简言之就是对原式特征一步又一步的浓缩,最终得到的特征更可靠。利用最后一层特征可以做各种任务:比如分类、回归等。

卷积计算流程

技术图片

左区域的三个大矩阵是原式图像的输入,RGB三个通道用三个矩阵表示,大小为7*7*3。

Filter W0表示1个filter助手,尺寸为3*3,深度为3(三个矩阵);Filter W1也表示1个filter助手。因为卷积中我们用了2个filter,因此该卷积层结果的输出深度为2(绿色矩阵有2个)。

Bias b0是Filter W0的偏置项,Bias b1是Filter W1的偏置项。

OutPut是卷积后的输出,尺寸为3*3,深度为2。

计算过程:

输入是固定的,filter是指定的,因此计算就是如何得到绿色矩阵。第一步,在输入矩阵上有一个和filter相同尺寸的滑窗,然后输入矩阵的在滑窗里的部分与filter矩阵对应位置相乘:

技术图片技术图片对应位置相乘后求和,结果为0

技术图片技术图片对应位置相乘后求和,结果为2

技术图片技术图片对应位置相乘后求和,结果为0

第二步,将3个矩阵产生的结果求和,并加上偏置项,即0+2+0+1=3,因此就得到了输出矩阵的左上角的3:

技术图片

第三步,让每一个filter都执行这样的操作,变可得到第一个元素:

技术图片

第四步,滑动窗口2个步长,重复之前步骤进行计算

技术图片

第五步,最终可以得到,在2个filter下,卷积后生成的深度为2的输出结果:

技术图片

思考:

①为什么每次滑动是2个格子?

技术图片

滑动的步长叫stride记为S。S越小,提取的特征越多,但是S一般不取1,主要考虑时间效率的问题。S也不能太大,否则会漏掉图像上的信息。

②由于filter的边长大于S,会造成每次移动滑窗后有交集部分,交集部分意味着多次提取特征,尤其表现在图像的中间区域提取次数较多,边缘部分提取次数较少,怎么办?

技术图片

一般方法是在图像外围加一圈0,细心的同学可能已经注意到了,在演示案例中已经加上这一圈0了,即+pad 1。 +pad n表示加n圈0.

技术图片

③一次卷积后的输出特征图的尺寸是多少呢?

技术图片

请计算上图中Output=?

技术图片

注意:在一层卷积操作里可以有多个filter,他们是尺寸必须相同。

技术图片

卷积参数共享原则

技术图片

在卷积神经网络中,有一个非常重要的特性:权值共享。

所谓的权值共享就是说,给一张输入图片,用一个filter去扫这张图,filter里面的数就叫权重,这张图每个位置是被同样的filter扫的,所以权重是一样的,也就是共享。

池化层

技术图片

上图显示,池化就是对特征图进行特征压缩,池化也叫做下采样。选择原来某个区域的max或mean代替那个区域,整体就浓缩了。下面演示一下pooling操作,需要制定一个filter的尺寸、stride、pooling方式(max或mean):

技术图片

卷积神经网络的组成

技术图片

卷积——激活——卷积——激活——池化——......——池化——全连接——分类或回归

前向传播与反向传播

之前已经讲解了卷积层前向传播过程,这里通过一张图再回顾一下:

技术图片

下面讲解卷积层的反向传播过程:

技术图片

反向传播的目的:更新参数w。因此要先算出dJ/dw。假设上一层会传过来一个梯度dJ/dout,根据链式求导法则,因此dJ/dw = dJ/dout * dout/dw =dJ/dout * x 。在计算机中方便为变量命名的缘故,将dJ/dout记为dout,dJ/dw记为dw,即图中的情况。后面也用这个记号来讲。

首先要清楚:dw 和 w 的尺寸是一样的。一个点乘以一个区域还能得到一个区域。那么反向传播过程就相当于:用dout中的一个元素乘以输入层划窗里的矩阵便得到一个dw矩阵;然后滑动滑窗,继续求下一个dw,依次下去,最后将得到的多个dw相加,执行 w = w - dw 就完成了反向传播的计算。

上面的反向传播可以更新一个filter中的参数,还要求其他的filter。

技术图片

技术图片

下面用图示来看一下2种不同的pooling过程——池化层的前向传播:

技术图片

在池化层进行反向传播时,max-pooling和mean-pooling的方式也采用不同的方式。

对于max-pooling,在前向计算时,是选取的每个2*2区域中的最大值,这里需要记录下最大值在每个小区域中的位置。在反向传播时,只有那个最大值对下一层有贡献,所以将残差传递到该最大值的位置,区域内其他2*2-1=3个位置置零。具体过程如下图,其中4*4矩阵中非零的位置即为前边计算出来的每个小区域的最大值的位置

技术图片

对于mean-pooling,我们需要把残差平均分成2*2=4份,传递到前边小区域的4个单元即可。具体过程如图:

技术图片

卷积网络架构实例

技术图片

VGGNet深度更多,有很多卷积层和池化层。一个版本有16层,另一个版本有19层(较常用)。

VGGNet的特点:

filter只有3*3的,意味着计算的特征较多,粒度更细。同时pooling的参数也有固定。

注意:传统的卷积神经网络层数越多并以意味着效果更好。而在2016年推出了深度残差网络达到了152层。后续讲介绍。

那么训练一个VGGNet有多少内存开销呢?

技术图片

从图可得知,训练过程中一张224*224*3的图像会有138M个参数会占93MB的内存。因此每个batch中图像的数目应该受内存的约束,即 93*图像数目<内存总容量。

一文让你彻底理解select语句的执行逻辑

正常情况下SELECT的书写顺序和执行顺序:书写顺序:SELECT》FROM》WHERE》GROUPBY》HAVE》ORDERBY执行顺序:FROM》WHERE》GROUPBY》HAVE》SELECT》ORDERBY以下以Product表为例:执行以下代码说明执行过程:SELECTproduct_type,count(*)FROMProductWHEREsale_price... 查看详情

一文了解循环神经网络

循环神经网络一、什么是循环神经网络:循环神经网络(RerrentNeuralNetwork,RNN),是神经网络的一种,类似的还有深度神经网络DNN,卷积神经网络CNN,生成对抗网络GAN。RNN的特点是对具有序列特性的数据... 查看详情

万字详解jvm,让你一文吃透

...享自华为云社区《​​【JVM】关于JVM,你需要掌握这些|一文彻底吃透JVM系列​​》,作者:冰河。JDK是什么?JDK是用于支持Java程序开发的最小环境。Java程序设计语言Java虚拟机JavaAPI类库JRE是什么?JRE是支持Java程序运行的标准环... 查看详情

一文看懂img2col卷积加速算法

...接卷积计算一定是很直接的,也是大多数人学习卷积神经网络时所直观了解的卷积计算方式。直接卷积是按照卷积层的计算特性进行计算,卷积核中的权重矩阵在经过补零后的输入特征图中滑动,每次在输入特征图中... 查看详情

一文看懂img2col卷积加速算法

...接卷积计算一定是很直接的,也是大多数人学习卷积神经网络时所直观了解的卷积计算方式。直接卷积是按照卷积层的计算特性进行计算,卷积核中的权重矩阵在经过补零后的输入特征图中滑动,每次在输入特征图中... 查看详情

一文让你彻底理解having和where的区别(代码片段)

having子句与where都是设定条件筛选的语句,有相似之处也有区别。having与where的区别:having是在分组后对数据进行过滤where是在分组前对数据进行过滤having后面可以使用聚合函数where后面不可以使用聚合在查询过程中执行顺序:from&g... 查看详情

一文让你彻底搞懂多线程(代码片段)

如果对什么是线程、什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内。用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现。说这个话其... 查看详情

一文让你彻底掌握操作符(超详细教程)(代码片段)

✅作者简介:大家好,我是小杨📃个人主页:「小杨」的csdn博客🔥系列专栏:小杨带你刷牛牛🐳希望大家多多支持🥰一起进步呀!💬该专栏配套的刷题神器👉点击跳转进入网站大家... 查看详情

万字详解jvm,让你一文吃透(代码片段)

...分享自华为云社区《【JVM】关于JVM,你需要掌握这些|一文彻底吃透JVM系列》,作者: 冰河。JDK是什么?JDK是用于支持Java程序开发的最小环境。Java程序设计语言Java虚拟机JavaAPI类库JRE是什么?JRE是支持Java程序... 查看详情

几张图让你彻底了解javasejavaeejavaweb整个的知识体系

查看详情

一文让你彻底弄懂mysql自增列

参考技术A   MYSQL的自增列在实际生产中应用的非常广泛,相信各位所在的公司or团队,MYSQL开发规范中一定会有要求尽量使用自增列去充当表的主键,为什么DBA会有这样的要求,各位在使用MYSQL自增列时遇到过哪些问题... 查看详情

python入门到精通一文让你彻底搞懂python的函数(代码片段)

🚀作者:“大数据小禅”🚀粉丝福利:加入小禅的大数据社群🚀欢迎小伙伴们点赞👍、收藏⭐、留言💬目录Python中的函数及其调用对于函数的理解:python中的自定义函数自定义空函数Python特性之... 查看详情

tensorflow一文弄懂cnn中的padding参数(代码片段)

在深度学习的图像识别领域中,我们经常使用卷积神经网络CNN来对图像进行特征提取,当我们使用TensorFlow搭建自己的CNN时,一般会使用TensorFlow中的卷积函数和池化函数来对图像进行卷积和池化操作,而这两种函数中都存在参数p... 查看详情

一文让你彻底弄懂“vue-style-loader”跟“style-loader”区别(代码片段)

简介用过vue-cli脚手架搭建vue项目都知道,vue-cli中内置了vue-style-loader去加载样式模块,最后通过<style>标签把样式加载到页面,但是style-loader同样可以达到同样的效果,那么vue官方为啥还封装一个vue-style-loader... 查看详情

一文让你轻松了解java开发中的四种加密方法

文章目录一、工具类md5加密工具类base64加密工具类Bcrypt工具类二、加密测试MD5加密测试base64加密测试SHA加密测试BCrypt加密测试一、工具类1.md5加密工具类package加密Tester.util;importjava.security.MessageDigest;publicclassMD5Utils{privatestaticfinalStr... 查看详情

一文看尽深度学习中的20种卷积(附源码整理和论文解读)

引言卷积,是卷积神经网络中最重要的组件之一。不同的卷积结构有着不一样的功能,但本质上都是用于提取特征。比如,在传统图像处理中,人们通过设定不同的算子来提取诸如边缘、水平、垂直等固定的特征... 查看详情

一文让你了解关于dao的全部(代码片段)

概念DAO是个缩写,它的全称是decentralizedautonomousorganization,中文可以翻译为去中心自治组织。其实它的概念中的几个词基本诠释了DAO的核心理念。第一个词是去中心化。DAO是建立在区块链技术之上的,自然的就满足去... 查看详情

一篇文章让你彻底了解什么是http

摘要本文主要内容介绍什么是http协议,什么是https协议,http协议与https协议之间的差别,那么我们开始吧~了解http协议之前我们先了解一下当我们输入一个url到页面渲染出来,这个过程发什么了什么呢~网络开启线程开始解析urlDNS... 查看详情