文章目录
- 1.输入层Input
- 2.卷积层Conv
- 3.激活函数层
- (一)Sigmoid 函数
- (二)Tanh 函数
- (三)修正线性单元ReLU
- (四)Leaky ReLU函数(带泄露的Relu)
- (五)参数化ReLU
- 4.池化层POOL
- 5.全连接层FC
- 6.输出层Output
用全连接神经网络处理大尺寸图像具有三个明显的缺点:
①将图像展开为向量会丢失临近像素的空间信息
②模型参数过多,因此效率低下,训练困难
③大量参数也很块会导致网络过拟合
针对这些问题,提出了卷积神经网络,很好的解决了这些问题。
目的:减少网络参数数量,达到更好效果
1.输入层Input
图像数据
2.卷积层Conv
提取特征(将图像分成一个个小区域,利用卷积核生成对应的特征图)
卷积运算的目的是提取输入的不同特征,某些卷积层可能只能提取一些低级的特征如边缘、线条和角等层级,更多层的网络能从低级特征中迭代提取更复杂的特征。
可以看出卷积是一种局部操作,通过一定大小的卷积核作用于局部图像区域获得图像的局部信息。
5×5的数据经过3×3的卷积核生成3×3的特征图
卷积核:
· 例
第一个区域特征值:
(1)多通道卷积
当有多个通道channel时,例如图片可以有RGB三个通道,卷积核需要拥有相同的channel数,每个卷积核channel与输入层的对应channel进行卷积,将每个channel的卷积结果相加得到最终的feature map。
(2)多卷积核
当有多个卷积核时,可以学习到多种不同的特征,对应产生多个channel的feature map。多个功能的卷积核得计算结果放在一起,能够检测到图片中不同得特征(边缘检测)
一个卷积层中可以有多个不同的卷积核,而每一个卷积核都对应一个特征图。
多通道卷积 | 多卷积核 |
---|---|
卷积核channel数是确定的前面是3×3×3,则卷积核的channel必须是3,每一个卷积核的通道数量必须要与输入通道数量保持一致 | 卷积核的个数不是确定的 |
卷积核每个channel生成的不是独立的,需要相加并加上偏置量b,这里卷积输出结果只有1个,因为卷积核只有1个。 | 每个卷积核生成的feature map是独立的,不需要相加,设置几个卷积核就产生几个feature map,这里输出结果有4个feature map,因为传入了3×3×3×4 |
3.激活函数层
激活函数是用来加入非线性。常见的激活函数有sigmod、tanh、relu,前两者常用在全连接层,relu常见于卷积层。
问题:为什么要在卷积层后面添加激活函数?
如果只有线性变换,那无论多少层神经元,都能简化成一层神经元,那神经网络只是简单多元线性回归而已,不能拟合更加复杂的函数。举个例子,如果我们只有线性操作,那么我们的神经网络永远无法拟合圆等复杂的曲线图形,永远只能表示超平面,无法表示曲面等。
因为卷积对输入图像进行的操作是线性的,但输入的图像的信息不都是线性可分的,所以通过激活函数来进行非线性操作,能够更好的映射特征去除数据中的冗余,以增强卷积神经网络的表达能力。
问题:激活函数为什么要使用非线性的?
使用线性激活函数和不适用激活函数、直接使用logistic回归没有区别,那么无论神经网络有多少层,输出都是输入的线性组合,与没有隐藏层的效果相当,就成了最原始的感知器了。
作用:
①将神经网络非线性化,即提升神经网络的拟合能力,能拟合更复杂的函数。
②激活函数可以引入非线性因素。如果不使用激活函数,则输出信号仅是一个简单的线性函数。线性函数一个一级多项式,线性方程的复杂度有限,从数据中学习复杂函数映射的能力很小。没有激活函数,神经网络将无法学习和模拟其他复杂类型的数据,例如图像视频、音频、语音等。
③激活函数可以把当前特征空间通过一定的线性映射转换到另一个空间,让数据能够更好的被分类。
添加激活层:
(一)Sigmoid 函数
sigmoid 函数公式如上式所示,函数图像如图所示。该函数能够把变量映射到[0,1]区间,所以一般是用来处理二分类的问题。
观察还能发现在 sigmoid函数两端,对于大于5或小于-5的值无论多大或多小都会压缩到0或1。如此便带来一个严重问题,即梯度的“饱和效应”。
对照sigmoid函数的梯度图,大于5或小于-5部分的梯度接近0,这会导致在误差反向传播过程中导数处于该区域的误差将很难甚至根本无法传递至前层, 进而导致整个网络无法训练(导数为0将无法更新网络参数)。
此外,在参数初始化的时候还需特别注意,要避免初始化参数直接将输出值域带入这一区域:一种可能的情形是当初始化参数w过大时,将直接引发梯度饱和效应而无法训练。
解决办法:初始化参数w设置小点,这样生成的x值就会少,对应的斜率即梯度就会大更新参数就会快。
(二)Tanh 函数
tanh 函数公式如上所示,tanh 函数图像如图 2.17 所示,是将变量映射到[-1,1]区间。
tanh函数存在和sigmoid函数一样的缺点:当x趋近无穷大或无穷小,导数的梯度(即函数的斜率)就趋近于0,这使得梯度算法的速度会减慢。
(三)修正线性单元ReLU
因为 sigmoid 和 tanh 函数在反向传播中常常因为值过小而造成梯度消失,ReLU 函数能够避免部分这个问题,ReLU 是修正线性单元(Rectified Linear Unit),ReLU 函数的表达式如下式所示:
从图中可以看出 ReLU 函数不是连续的,属于分段函数:当x<0时, f(x)值为0,当x≥0 时, f(x)等于x,x≥0部分完全消除了sigmoid型函数的梯度饱和效应,因此不会出现梯度消失的情况。
与sigmoid、tanh 激活函数相比,ReLU 函数当输入小于0时梯度等于0,这时神经元不会被激活,所以在某一段时间里只有部分神经元会被激活,在反向传播过程中收敛速度会更快。
优点:
①ReLU激活函数计算量更小
②收敛速度远快于sigmoid和tanh;
③解决部分梯度消失问题
ReLU的梯度大多数情况下是常数,有助于解决深层网络的收敛问题
④因为ReLU不会梯度消失只有线性关系,会让网络训练更快;
缺点:
①强制性把负值置为0,可能丢掉一些特征;
②当输入为负数时,权重无法更新,导致神经元死亡(学习率不要太大)
(四)Leaky ReLU函数(带泄露的Relu)
为了缓解“死区”现象,研究者将ReLU函数中x<0的部分调整为,其中为0.01或0.001数量级的较小正数。这种新型的激活函数被称作Leaky ReLU:
可以发现,原始ReLU函数实际上是Leaky ReLU函数的一个特例,即.
不过由于Leaky ReLU函数中为超参数,合适的值较难设定且较为敏感,因此Leaky ReLU函数在实际使用中的性能并不十分稳定。
(五)参数化ReLU
参数化ReLU的提出很好的解决了Leaky ReLU函数中超参数不易设定的问题:参数ReLU直接将也作为一个网络中可学习的变量融入模型的整体训 练过程。
注:Leaky ReLU中的α需经人为指定,而参数化ReLU中α则经网络学习得到。
4.池化层POOL
池化(特征压缩/下采样)是将输入图像进行缩小,减少像素信息,只保留重要信息,主要是为了减少计算量。主要包括最大池化和均值池化。
作用:
①减少网络中的参数计算量,从而遏制过拟合;
②增强网络对输入图像中的小变形、扭曲、平移的鲁棒性(输入里的微小扭曲不会改变池化输出——因为我们在局部邻域已经取了最大值/平均值)。
③帮助我们获得不因尺寸而改变的等效图片表征。这非常有用,因为这样我们就可以探测到图片里的物体,不管它在哪个位置。
特征:
①没有要学习的参数
池化层和卷积层不同,没有要学习的参数。池化是从目标区域中取最大值(或平均值),所以不要学习的参数。
②通道数不发生变化
经过池化运算,输入数据和输出数据的通道数不会发生变化。
③对微小的位置变化具有鲁棒性
输入数据发生微小偏差时,池化仍会返回相同的结果。因此,池化对输入数据的微小偏差具有鲁棒性。比如,3X3的池化的情况下,如下图,池化会吸收输入数据的偏差(根据数据不同,结果可能不一致)。
从上图看,池化只是变长和宽,而特征图的个数其实不会变。
最大池化MAX POOLING(选取最大的特征值)
(1)目的:抓住主要矛盾,忽略次要因素。
(2)意义:降低数据维度,减少训练参数,避免过拟合。
通用池化层过滤器:f=2×2,s=2
注:池化层没有涉及到任何的矩阵计算,只是一个筛选、压缩、过滤的过程。
5.全连接层FC
全连接层在整个卷积神经网络中起分类器的作用,在全连接层之前需要将之前的输出feature map展平;再接一个或多个全连接层,进行模型学习。
全连接层相当于一个普通神经网络。
如果说卷积层、汇合层和激活函数层等操作是将原始数据映射到隐层特征空间的话,全连接层则起到将学到的特征表示映射到样本的标记空间的作用。
在实际使用中,全连接层可由卷积操作实现:对前层是全连接的全连接层可以转化为卷积核为1×1的卷积;而前层是卷积层的全连接层可以转化为卷积核为h×w的全局卷积,h和w分别为前层卷积输出结果的高和宽。
· 例1
以经典的VGG-16网络模型为例,对于224×224×3的图像输入,最后一层卷积层(指VGG-16的Pool5)可得输出为7×7×512的特征张量,若后层是一层含4096个神经元的全连接层时,则可用卷积核为7×7×512×4096的全局卷积来实现这一全连接运算过程。
其中该卷积核具体参数如下,经过此卷积操作后可得1×1×4096的输出。
如需再次叠加一个含2048个神经元的全连接层,可设定以下参数的卷积层操作:
· 例2
全连接层FC前面一层结果是32×32×10,那么全连接层的矩阵第一个参数是32×32×10=10240,第二个参数取决于最终要分成几类,上图分成5类即第二个参数是5,那么矩阵是[10240,5]。
6.输出层Output
分类 | 回归 |
---|---|
采用Softmax函数 | 采用线性函数 |