【深度学习】卷积神经网络入门

    卷积神经网络入门

    在之前的博客中,已经基于周志华老师的《机器学习》讲过了:【深度学习】神经网络介绍

https://blog.csdn.net/u012679707/article/details/80483404

     本节主要讲卷积神经网络的组成。卷积神经网络(CNN)由输入层、卷积层、激活函数、池化层、全连接层组成,即:

INPUT(输入层)-CONV(卷积层)-RELU(激活函数)-POOL(池化层)-FC(全连接层)

 

1. 卷积层

    主要介绍卷积层的构成、卷积层的作用、卷积层的特性、卷积的过程、卷积层输出特征图的大小的计算。

【卷积层的作用】

    卷积层,一般用来做特征提取。

【卷积层的介绍】

    输入图像是32*32*33是它的深度(即RGB),卷积层是一个5*5*3的filter(感受野)。通过一个filter与输入图像的卷积可以得到一个28*28*1的特征图,下图是用了6个filte,得到了6个特征图。

                

    下图中,第二层到第三层,其中每个卷积核大小为5x5x6,这里的6就是28x28x6中的6,两者需要相同,即每个卷积核的“层数”需要与输入的“层数”一致有几个卷积核,就输出几个featuremap,下图中,与第二层作卷积的卷积核有10个,故输出的第三层有10个通道。

                         

    注意:每个卷积核的“层数”需要与输入的“层数”一致。有几个卷积核,就输出几个feature map。

    通常,会使用多层的卷积层来得到更深层次的特征图。如下:

                        

【卷积的过程】

    输入图像和filter的对应位置元素相乘再求和,最后再加上偏置b,得到特征图。

    如下图所示,filter w0的第一层深度和输入图像的蓝色方框中对应元素相乘再求和得到0,其他两个深度得到2,0,则有0+2+0+1=3即图中右边特征图(绿色)的第一个元素3,卷积过后输入图像的蓝色方框再滑动,stride(步长)=2。如下图:

                

【特征图的大小的计算】

                            

    例1:

    NxN大小的输入(暂时不考虑通道数),与FxF大小的卷积核(暂时不考虑个数)做卷积,那么输出大小为多大?计算公式为:(N - F) / stride + 1,其中stride为做卷积是相邻卷积核的距离。

                            

    例2:

    当输入为7x7大小,卷积核为3x3,stride=1,在7x7周围补上一圈0(pad=1个像素),那么输出大小为多大?

    答案是:7x7。(加了边界填充后,卷积输出图像与输入图像大小相同!这就是边界填充的作用!

                                

    【详解边界填充P】

    边界填充,zero Pad项,即为图像加上一个边界,边界宽度为P,边界元素均为0。(对原输入无影响。)

    边界宽度是一个经验值,加上zero pad这一项是为了使输入图像和卷积后的特征图具有相同的维度。边界宽度一般为:

        

    例如:输入为5*5*3,filter为3*3*3,在zeropad 为1时,则加上zero pad后的输入图像为7*7*3,则卷积后的特征图大小为5*5*1((7-3)/1+1),与输入图像一样;

【卷积层的特性】

    卷积层有一个特性:权值共享原则。

    权值共享,即同一个输入图片上的像素点,共享同一个filter的权值。比如,给一张输入图片,用同一个filter去扫这张图,那这张图的每个位置都是被同样的filter扫的(filter里面存放着权值),所以权重是一样的,也就是共享。

                

    如没有这个“权值共享”原则,则输出的特征图由1032*32*1的特征图组成,即每个特征图上有1024个神经元,每个神经元对应输入图像上一块5*5*3的区域,即一个神经元和输入图像的这块区域有75个连接,即75个权值参数,则共有75*1024*10=768000个权值参数,这是非常复杂的,因此卷积神经网络引入权值共享原则,即一个特征图上每个神经元对应的75个权值参数被每个神经元共享,这样则只需75*10=750个权值参数,而每个特征图的偏置值也共享,即需要10个偏置值,则总共需要750+10=760个参数。

 2.激活函数

    激活函数,并不是去激活什么,而是指如何把“激活的神经元的特征”通过函数把特征保留并映射出来(保留特征,去除一些数据中是的冗余),这是神经网络能解决非线性问题关键。

    【激活函数的意义】

    在生物意义上的神经元中,只有前面的树突传递的信号的加权和值大于某一个特定的阈值的时候,后面的神经元才会被激活。

简单的说激活函数的意义在于判定每个神经元的输出y= w1*x1 +w2*x2+ w3*x3 +b有没有达到阈值

    (1) 未加激活函数的普通神经元模型:

    y= w1*x1 +w2*x2+ w3*x3 +b

                    

    (2) 加了激活函数sigmoid的神经元模型

    Z = w1*x1 +w2*x2+ w3*x3 +b

    Y=sigmoid (Z)

                     

【激活函数的作用】

    (1) 激活函数是用来加入非线性因素的,因为线性模型的表达力不够 

    (2) 构建稀疏矩阵,也就是稀疏性,这个特性可以去除数据中的冗余,最大可能保留数据的特征,也就是大多数为0的稀疏矩阵来表示。(这个特性主要是对于Relu

     卷积层的线性模型是指,在卷积层中,我们主要采用了卷积的方式来处理,也就是对每个像素点赋予一个权值,这个操作显然就是线性的。

    但是对于我们样本来说,不一定是线性可分的,为了解决这个问题,我们可以进行线性变化,或者我们引入非线性因素,解决线性模型所不能解决的问题。

                         

    如上图左图,可以用一条直线将数据分开,所以该数据是线性可分的。

    如上图右图,不可以用一条直线将数据分开,所以该数据是线性不可分的。

    所以激活函数可以加入非线性因素,解决线性模型所不能解决的问题

【激活函数的性质】

    激活函数应该具有的性质: 
    (1)非线性。线性激活层对于深层神经网络没有作用,因为其作用以后仍然是输入的各种线性变换。。 
    (2)连续可微。梯度下降法的要求。 
    (3)范围最好不饱和,当有饱和的区间段时,若系统优化进入到该段,梯度近似为0,网络的学习就会停止。 
    (4)单调性,当激活函数是单调时,单层神经网络的误差函数是凸的,好优化。 
    (5)在原点处近似线性,这样当权值初始化为接近0的随机值时,网络可以学习的较快,不用可以调节网络的初始值。 
目前常用的激活函数都只拥有上述性质的部分,没有一个拥有全部的~~

【常用的激活函数】

常用的激活函数有:simoid,tanh, ReLu

(1)Sigmoid

    数学表达式: 

    模型:       

    sigmoid函数输入一个实值的数,然后将其压缩到0~1的范围内。特别地,大的负数被映射成0,大的正数被映射成1。sigmoid function在历史上流行过一段时间因为它能够很好的表达“激活”的意思,未激活就是0,完全饱和的激活则是1。而现在sigmoid已经不怎么常用了,主要是因为它有两个缺点:
    ∙ 饱和时梯度值非常小。由于BP算法反向传播的时候后层的梯度是以乘性方式传递到前层,因此当层数比较多的时候,传到前层的梯度就会非常小,网络权值得不到有效的更新,即梯度耗散。如果该层的权值初始化使得f(x) 处于饱和状态时,网络基本上权值无法更新。 
    ∙ 输出值不是以0为中心值。

(2) Tanh

    数学表达式:

    模型: 

                                         

(3) ReLU

    数学表达式:                    

    模型:

                           

    很显然,从上图中可以看出,输入信号<0时,输出为0,>0时,输出等于输入。ReLU的优缺点如下:

    优点1:Krizhevsky et al.在ImageNet Classificationwith Deep Convolutional NeuralNetworks 提出使用 ReLU 得到的SGD的收敛速度会比 sigmoid/tanh 快很多(如上图右)。有人说这是因为它是linear,而且梯度不会饱和。

    为什么线性不饱和,就会收敛的快?反向传播算法中,下降梯度等于敏感度乘以前一层的输出值,所以前一层输出越大,下降的梯度越多。该优点解决了sigmod的问题1的一部分

    优点2:相比于 sigmoid/tanh需要计算指数等,计算复杂度高,ReLU 只需要一个阈值就可以得到激活值。

    缺点1: ReLU在训练的时候很”脆弱”,一不小心有可能导致神经元”坏死”。举个例子:由于ReLU在x<0时梯度为0,这样就导致负的梯度在这个ReLU被置零,而且这个神经元有可能再也不会被任何数据激活。如果这个情况发生了,那么这个神经元之后的梯度就永远是0了,也就是ReLU神经元坏死了,不再对任何数据有所响应。实际操作中,如果你的learningrate 很大,那么很有可能你网络中的40%的神经元都坏死了。 当然,如果你设置了一个合适的较小的learning rate,这个问题发生的情况其实也不会太频繁。

​     这个缺点类似sigmod问题1的另一部分,也就是说,如果在训练中某一次下降的太快,会导致该卷积核对要提取的特征要求过高,形象的说,就是变成了一个“完美主义”卷积核,所有形状都入不了它的眼,这样这个神经元就没用了,坏死了。

 

 

3.池化层

    池化层往往在卷积层后面,通过池化来降低卷积层输出的特征向量,同时改善结果(不易出现过拟合)。

    【池化层的作用】

    (1)对输入的特征图进行压缩,使特征图变小,简化网络计算复杂度;

    (2)进行特征压缩,提取主要特征。 

                     

    池化操作有两种:

        (1)平均池化:计算图像区域的平均值作为该区域池化后的值。

        (2)最大池化:选图像区域的最大值作为该区域池化后的值。

        最大池化最常用,如下图:采用一个2*2filtermax pooling是在每一个区域中寻找最大值,这里的stride=2,最终在原特征图中提取主要特征得到右图。 

                                    

    注意:这里的pooling操作是特征图缩小,有可能影响网络的准确度,因此可以通过增加特征图的深度来弥补(这里的深度变为原来的2倍)。

    为什么可以通过降低维度呢? 
    因为图像具有一种“静态性”的属性,这也就意味着在一个图像区域有用的特征极有可能在另一个区域同样适用。因此,为了描述大的图像,一个很自然的想法就是对不同位置的特征进行聚合统计,例如,人们可以计算图像一个区域上的某个特定特征的平均值 (或最大值)来代表这个区域的特征。

 4.全连接层

    连接所有的特征,将输出值送给分类器(如softmax分类器)。所以,全连接层的作用为:分类。

    总体结构如下:


    --------------------------------------------------------------以下答案来自知乎魏秀参------

    全连接层(fully connected layers,FC)在整个卷积神经网络中起到“分类器”的作用。如果说卷积层、池化层和激活函数层等操作是将原始数据映射到隐层特征空间的话,全连接层则起到将学到的“分布式特征表示”映射到样本标记空间的作用

    在实际使用中,全连接层可由卷积操作实现:对前层是全连接的全连接层可以转化为卷积核为1x1的卷积;而前层是卷积层的全连接层可以转化为卷积核为h*w的全局卷积,h和w分别为前层卷积结果的高和宽。

    注1: 有关卷积操作“实现”全连接层,有必要多啰嗦几句。

以VGG-16为例,对224x224x3的输入,最后一层卷积可得输出为7x7x512,如后层是一层含4096个神经元的FC,则可用卷积核为7x7x512x4096的全局卷积来实现这一全连接运算过程,其中该卷积核参数如下:

“filter size = 7, padding = 0, stride = 1, D_in =512, D_out = 4096”

经过此卷积操作后可得输出为1x1x4096。

如需再次叠加一个2048的FC,则可设定参数为“filter size = 1, padding = 0, stride = 1, D_in = 4096, D_out = 2048”的卷积层操作。


注:1*1 卷积有什么作用?

1*1卷积过滤器 和正常的过滤器一样,唯一不同的是它的大小是1*1,没有考虑在前一层局部信息之间的关系。最早出现在 Network In Network的论文中 ,使用1*1卷积是想加深加宽网络结构 ,在Inception网络( Going Deeper with Convolutions )中用来降维.

由于3*3卷积或者5*5卷积在几百个filter的卷积层上做卷积操作时相当耗时,所以1*1卷积在3*3卷积或者5*5卷积计算之前先降低维度。


那么,1*1卷积的主要作用有以下几点:

1、降维( dimension reductionality )

某次卷积之后的结果是W*H*100的特征,现在需要用1*1的卷积核将其降维成W*H*10,即100个通道变成10个通道: 

通过一次卷积操作,W*H*100将变为W*H*1,这样的话,使用10个1*1的卷积核,显然可以卷积出10个W*H*1,再做通道的串接操作,就实现了W*H*5。


2. 升维

  比如某次卷积之后的结果是W*H*6的特征,现在需要用1*1的卷积核将其降维成W*H*7,即6个通道变成7个通道:
  通过一次卷积操作,W*H*6将变成W*H*1,这样的话,使用7个1*1的卷积核,显然可以卷积出7个W*H*1,再做铜套串接操作,就实现了W*H*7。


3、加入非线性

卷积层之后经过激励层,1*1的卷积在前一层的学习表示上添加了非线性激励( non-linear activation,ReLU ),提升网络的表达能力;


-------------------------------------------         END      -------------------------------------
[参考]

激活函数的作用 https://blog.csdn.net/u014088052/article/details/50923924

卷积神经网络介绍 https://blog.csdn.net/yjl9122/article/details/70198357

 



 

 

 

 

阅读更多
个人分类: 深度学习
上一篇【c++】volatile -- 限定修饰符
下一篇【tensorflow】mnist手写数字识别--tensorflow实现
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭