啥是卷积神经网络(一)

絮絮叨叨

网络上有关卷积神经网络的优秀博客和教学视频不胜枚举,对于初学者来说,吴恩达李宏毅和各类培训机构的视频都是很优秀的视频教学。经过不断的学习和努力终于达到了一学就会,一用就废的境界。于是乎,在家期间,把以前学过的知识点进行了系统的梳理。后续的博客就按照我复习的顺序来记录,望各位大神给与意见。

卷积神经网络(CNN)是啥?

卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),是深度学习(deep learning)的代表算法之一 。卷积神经网络具有表征学习(representation learning)能力,能够按其阶层结构对输入信息进行平移不变分类(shift-invariant classification),因此也被称为“平移不变人工神经网络(Shift-Invariant Artificial Neural Networks, SIANN)” 。-------以上内容来自百度百科。

众所周知,卷积神经网络的结构包括输入层隐含层输出层 ,其中输入层和输出层没啥,就像我是做图像这一块的,输入层就是一个处理后的图像矩阵,输出层是一个一维的矩阵。当你去百度卷积神经网络,你会发现几乎所有的博主都在讨论下面三个关键词:
1.局部感受野
2.权值共享
3.池化(下采样)

没有错,这三点正是卷积神经网络减少参数量、防止过拟合和平移不变性的关键所在。这三个神乎其神的操作,都是在隐含层中进行操作的。因此,你把隐含层搞明白了,卷积神经网络也就搞明白了。

隐含层

不同神经网络的隐含层具有不同的结构,但万变不离其中。主要就包括卷积层(convolutional layer)、池化层(pooling layer)和全连接层(fully-connected layer)。下面就对这三个东西进行详细说明。

卷积层

卷积其实很容易理解,有兴趣的同学可以找一下卷积的公式,公式大致的意思就是先相乘后相加,接下来用图片进行展示(图片是以前下载下来的,忘记出处,原创看到请和我说明,必添加引用说明)。在这里插入图片描述
这个就是卷积的大致过程,中间那个3X3的就是我们耳熟能详的卷积核了。这里就要引出局部感受野这个嘉宾了。
由于各个层与层之间均为局部连接,因此就叫它局部感受野。那啥是感受野呢,这玩意怎么算呢?
感受野: 卷积神经网络每一层输出的特征图(feature map)上的像素点在输入图片上映射的区域大小。也就是特征图上的一个点对应上一个输入图上的区域,差不多就像下面这个图片这样。
在这里插入图片描述
大致就是这个意思,详细的解释大家想找的可以百度一下看看。接下来就是这玩意怎么算了。我查找了一些文章和博客,大致内容如下:

  1. 最后一层(卷积层或池化层)输出特征图感受野的大小等于卷积核的大小。
  2. 第i层卷积层的感受野大小和第i层的卷积核大小和步长有关系,同时也与第(i+1)层感受野大小有关。
  3. 计算感受野的大小时忽略了图像边缘的影响,即不考虑padding的大小。

然后就是数学公式了:
在这里插入图片描述其中,是第RFi层卷积层的感受野,是RF(i+1)层上的感受野,stride是卷积的步长,Ksize是本层卷积核的大小。
从上面的内容来看,大致也就知道感受野是从后往前计算的了。来个例子看看,计算网络每层的感受野。
在这里插入图片描述
从最后一层的池化层开始计算感受野:
pool3:RF=2(最后一层池化层输出特征图的感受野大小等于卷积核的大小)

conv4:RF=(2-1)*1+3=4。

conv3:RF=(4-1)*1+3=6。

pool2:RF=(6-1)*2+2=12。

conv2:RF=(12-1)*1+3=14。

pool1:RF=(14-1)*2+2=28。

conv1:RF=(28-1)1+3=30。
差不多这样就可以计算出感受野了。在说感受野的时候,提到了卷积核大小、卷积核步长和填充(padding) 三个名词,这三个东西是卷积层的三个参数。那为啥没有卷积核的具体参数呢?在深度学习中的卷积和图像处理中的卷积略有不同。二者
相同点是: 卷积计算的原理相同。
不同点是: 图像处理中,我们的目的很明确,比如去噪我们会用均值滤波、高斯滤
波等等。这些滤波器本身参数是确定好的,可以最好的实现预期的功能;但在深度学习中,我们不知道卷积核里有啥,里面的数是因为啥定下来的。但里面的东西说出来你绝对不会陌生,那就是权重w,有的时候带个偏置b。至于它们怎么来的你也不会陌生,那就是通过梯度下降法和损失函数得到的。
至于卷积核大小没啥说的了,步长指的是卷积核计算特征图两次之间的距离,卷积步长为1时,卷积核会逐个计算特征图的元素,步长为n时会在下一次计算跳过n-1个像素。padding说道就多了。
因为在卷积的过程中,随着卷积次数的增多,特征图大小会越来越小。有的时候我不想它变得太小,那咋办,就只能往特征图里面填东西了,填啥呢,为了不影响特征的提取,就只能填0了。至于填多少个0,那就得看你要多大的尺寸了。padding还提供了众生平等的功能,假设特征图大小为7
7,卷积核大小为3*3,步长为1.就按照上面那个图那么卷积,那是不是特征图中靠近中心的区域能被宠幸很多次 ,在边缘的区域就能被宠幸不几次。恰巧边缘有很重要的特征,提取不到你后悔不?padding就可以很好地解决这个问题,它能让边缘的特征被多次计算。填充完卷积的动态图。Please Look(原图链接https://www.cnblogs.com/raorao1994/p/9485814.html)
在这里插入图片描述
当然,填充在反卷积中填充可以使特征图恢复到指定大小,不信你看
在这里插入图片描述
实际上呢,神经网络中卷积核的深度不一定是1,而是挺深的,或者叫做多维输入的卷积。那是为啥呢,又该如何计算呢?来我们往下看。
一直有一个疑问,为啥卷积核要有不同深度的,有啥用呢?它是怎么卷积的呢?
这里附上几张百度飞浆教程里的图片,
在这里插入图片描述
这个图可以很直观的看到多维卷积核如何进行计算的,从这个图可以看出来,卷积核的维数决定了提取特征图的深度,也就是说,卷积核的深度就是提取特征图的深度。
那如果输入图像是多通道的呢,就以RGB三通道为例,
在这里插入图片描述
这个图可以很直观的看到多通道输入图像是如何进行卷积计算的,从这个图可以看出来,**卷积核的深度与输入图像通道数必须保持一致,当通道数一致的条件下,得到的特征图为二维。**说到这里,你可能有很多问号,为啥目前主流的网络结构都是有深度的啊。看了下面两张图你就会明白了
在这里插入图片描述
画的可能有点抽象,左侧的是输入特征图,W,H分别是长和宽,C表示深度。中间的是卷积核,Kw,Kh分别是卷积核的长和宽,卷积核深度同样是C。这俩玩意卷积之后得到最右侧的二维特征图。它变成二维的原因是卷积先相乘后相加的机制。具体的示例可以看看上面那个百度飞浆的教程图,
接下来是多维卷积核的情况,也是较为常见的情况,看图
在这里插入图片描述
这里多了一个参数N,它就是卷积核的个数,也就是输出特征图的维数。最后再来一张图,把我们熟悉的偏置项b加上。至于偏置项有啥用,就需要记住,偏置项就是让数据不过原点,或者说不为0,这样可以使神经网络更好的拟合收敛并且可以提高神经网络的精度。
在这里插入图片描述
既然说到卷积,就给它整明明白白的,相信大家都听过1X1的卷积核,它最早在2014年的GoogLeNet中提出来的,具体它有啥用呢?

  1. 很大程度的降低了特征维度,减少计算量;
  2. 提高了网络的表达能力;
  3. 可以增加网络模型的深度,提升模型的表征能力。

它是如何实现上面的三点功能的呢?看图说哈,
在这里插入图片描述

用深度为C的1X1卷积核对[C,H,W]形状的输入特征图进行卷积,得到的是[1,H,W]形状的特征图。那它如何实现降维呢?当然是用多个这样的卷积核了,如下图。
在这里插入图片描述

这样,通过1X1卷积核的数量就可以控制输出层的深度了。那1X1的卷积核是如何实现减少计算量的呢?这个东西你要对比着看,没有对比就没有差距。假设要对深度C=128的输入特征图通过64个5X5的卷积核进行卷积,那么用24个1X1卷积核和不用1X1卷积核参数计算量如下图所示。先来个不带的。
在这里插入图片描述
要完成一次卷积运算,一共要计算409600个参数,那是相当的多了。再来看看带1X1卷积核的。
在这里插入图片描述
没有对比就没有伤害啊,二者参数计算量相差9倍还多那么一丢丢。可见,1X1卷积核是真的可以降维并降低计算量啊。至于表征能力啥的,你看你训练的效果就知道了。
至于为什么用多维的卷积核,我认为有以下两点原因:
5. 提高特征提取的精度;
6. 减少计算参数。
在完成卷积运算后并不是池化,而是非常重要的一步,激活函数。啥是激活,咋激活呢?激活函数是来向神经网络中引入非线性因素的,通过激活函数,神经网络就可以拟合各种曲线。神经网络中的激活函数相当常见了,比较出名的Sigmoid函数、tanh函数、Relu函数、Leaky ReLU函数(PReLU)、ELU (Exponential Linear Units) 函数。下面对着几个激活函数进行简单的说明,(内容来自博客https://blog.csdn.net/tyhj_sf/article/details/79932893)。
1.Sigmoid函数
非线性的激活函数,它的数学形式和图像如下:
在这里插入图片描述
在这里插入图片描述
特点:
它能够把输入的连续实值变换为0和1之间的输出,特别的,如果是非常大的负数,那么输出就是0;如果是非常大的正数,输出就是1.
缺点:
1.在深度神经网络中梯度反向传递时导致梯度爆炸和梯度消失,其中梯度爆炸发生的概率非常小,而梯度消失发生的概率比较大。
2.Sigmoid 的 output 不是0均值(即zero-centered)。
3.其解析式中含有幂运算,计算机求解时相对来讲比较耗时。

tanh函数

在这里插入图片描述
在这里插入图片描述
它解决了Sigmoid函数的不是zero-centered输出问题,然而,梯度消失(gradient vanishing)的问题和幂运算的问题仍然存在。

Relu函数
在这里插入图片描述
在这里插入图片描述
优点:
1.解决了梯度消失问题 (在正区间)
2.计算速度非常快,只需要判断输入是否大于0
3.收敛速度远快于sigmoid和tanh
缺点:
1.ReLU的输出不是zero-centered
2.Dead ReLU Problem,指的是某些神经元可能永远不会被激活,导致相应的参数永远不能被更新。本质是由于Relu在的小于0时其梯度为0所导致的。

Leaky ReLU函数(PReLU)
在这里插入图片描述
在这里插入图片描述
a是一个很小的常数,取0~1。α=0.01时,PReLU为Leaky ReLU。修正数据分布,保留负轴的值,使负轴信息不全部丢失。
PReLU是ReLU的改进型,负数区域,PReLU有很小的斜率,避免ReLU死掉问题。相比于ELU,PReLU在负数区域内是线性运算,斜率虽然小,但不会趋于0。但有时候实际上效果还不如ReLu激活函数,
ELU (Exponential Linear Units) 函数
在这里插入图片描述
在这里插入图片描述
ELU有ReLU的基本所有优点,以及不会有Dead ReLU问题并且输出的均值接近0,但是它计算量有点大。
至于如何选择激活函数,大家可以视情况而定,我比较推荐在卷积的时候选择ReLu激活函数,在选择它的时候要好好设定一下Learing Rate 学习率。
就以ReLu为例,说一说它是如何激活的。来接着看图 。
在这里插入图片描述
这个图就很好的解释了激活函数的工作机制。这些卷积核里面的参数就是我们熟悉的权重,这里说一嘴啥是权重共享。我个人理解是,权重共享就是输入图像使用同一个卷积核进行卷积,说白了就是每两层之间使用的是相同的卷积核参数。这样可以大大的减少参数的计算量。

到目前为止,隐含层中的卷积层就介绍完了。接下来是池化层。

池化层

池化也叫下采样,相对来说比较容易理解,注意一点就是池化层不引入参数,这里引用百度飞浆的教程对池化层进行解释说明。
池化是使用某一位置的相邻输出的总体统计特征代替网络在该位置的输出,其好处是当输入数据做出少量平移时,经过池化函数后的大多数输出还能保持不变。比如:当识别一张图像是否是人脸时,我们需要知道人脸左边有一只眼睛,右边也有一只眼睛,而不需要知道眼睛的精确位置,这时候通过约化某一片区域的像素点来得到总体统计特征会显得很有用。由于池化之后特征图会变得更小,如果后面连接的是全连接层,能有效的减小神经元的个数,节省存储空间并提高计算效率。将一个2×2的区域池化成一个像素点。通常有两种方法,平均池化和最大池化。计算方式如图。
在这里插入图片描述
•平均池化。对池化窗口内的元素数值取平均,得到相应的输出特征图的像素值。
•最大池化。对池化窗口覆盖区域内的元素取最大值,得到输出特征图的像素值。
在卷积神经网络中,通常使用2×2大小的池化窗口,步幅也使用2,填充为0,则输出特征图的尺寸为原来大小的一半,且深度不变。
至此隐含层还包含最后一个部分就是全连接层

全连接层(fully connected layers,FC)

全连接层的作用就和字面上的意思差不多,把上一层的特征图全都一字排开的连接起来。下面是来自百度百科的定义——全连接层的每一个结点都与上一层的所有结点相连,用来把前边提取到的特征综合起来。
在卷积神经网络中,全连接层常出现在最后几层,用于对前面设计的特征做加权和。就拿物体识别来说,全连接层就是把最后一个特征图中数据进行加权求和,数值(得分)高的就是检测的类别。
首先,你得明白,全连接层是通过卷积核和激活函数实现的,举个例子,假如我们整个20分类的物体检测任务,那么最后输出层一定是输出20X1形状的数据,20对应的就是20个类别。至于是啥,就得看那个数据得分高了。现在的问题是20是怎么来的,我们来看一个图。
在这里插入图片描述
如果最后一个卷积池化激活后的特征图为[128,4,4]形状,将它作为输入,通过512个[128,4,4]的卷积核进行卷积运算(激活函数在后面这里没画出来),激活后得到了512个1X1的矩阵,将它们拉平,就得到了第一个全连接层,大小为[512,1]的二维矩阵向量,所以说全连接层是通过卷积核和激活函数实现的。那么问题来了,这[512,1]的二维矩阵如何变化成[20,1]的二维输出矩阵呢?接着往下看。
在这里插入图片描述
这里根据个人理解,画了一个简单的示意图,实际的神经网络中全连接层可能是多个,并且为了减少参数计算量会增加Dropout函数,并且输出层之前的激活函数一般都使用Softmax分类器,这里为了体现普遍性,就用问题代替了。说到底,全连接层也是通过卷积计算的。至于最后得到的[20,1]数据,就是目标检测的结果,是啥对应位置的数值会接近于1。
至此,卷积神经网络中的隐含层主体介绍的差不多了。后面接着复习学习,接着通过博客记录。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值