卷积神经网络(CNN)由输入层、卷积层、激活函数、池化层、全连接层组成,即INPUT(输入层)-CONV(卷积层)-RELU(激活函数)-POOL(池化层)-FC(全连接层)

        在上一篇博客中(https://blog.csdn.net/yql_617540298/article/details/104542823),已经将卷积神经网络中的卷积层、池化层知识点进行了总结,但是没有对全连接层进行描述,这一篇主要是总结全连接层相关知识点,以及对CNN的补充,以便加深对基础知识的学习。

参考链接:https://blog.csdn.net/weixin_38208741/article/details/80615580

参考链接:https://www.cnblogs.com/mfryf/p/11373142.html

参考链接:https://blog.csdn.net/nanhuaibeian/article/details/100532038

参考链接:https://blog.csdn.net/lianzhng/article/details/80652744

参考链接:https://blog.csdn.net/bruce_0712/article/details/80293027

参考链接:https://blog.csdn.net/weixin_41036461/article/details/80657929

一、全连接层

1. 什么是全连接层?

       连接所有的特征,将输出值送给分类器(如softmax分类器)。       

       在常见的卷积神经网络的最后往往会出现一两层全连接层,全连接一般会把卷积输出的二维特征图(feature map)转化成(N*1)一维的一个向量。

图片选自:https://blog.csdn.net/weixin_38208741/article/details/80615580

        最后的两列小圆球就是两个全连接层,在最后一层卷积结束后,又进行了一次池化操作,输出了20个12*12的图像(20指最后一层的厚度),然后通过了一个全连接层变成了1*100的向量(第一个全连接层神经元的个数是100)。

        该操作其实就是用100个20*12*12(20指的是池化层的厚度)的卷积核卷积出来的,对于输入的每一张特征图,都使用一个和图像大小一样的核卷积进行点积运算,这样整幅图就变成了一个数了,如果厚度是20就是那20个核卷积完了之后相加求和。这样就能把一张图高度浓缩成一个数了。

        这里换一张图(图片来源https://blog.csdn.net/nanhuaibeian/article/details/100532038),更清楚地展现全连接层

        对 n-1 层和 n 层而言,n-1 层的任意一个节点,都和第 n 层所有节点有连接(即第n层节点都和第n-1层节点相连接)。即第n层的每个节点在进行计算的时候,激活函数的输入是n-1层所有节点的加权。

2. 全连接层的弊端?

        全连接的参数实在是太多了,如果这张图里就有20*12*12*100个参数,前面随便一层卷积,假设卷积核是7*7的,厚度是64,参数的个数才是7*7*64,所以现在的趋势是尽量避免全连接,目前主流的一个方法是全局平均值。也就是最后那一层的feature map(最后一层卷积的输出结果),直接求平均值。有多少种分类就训练多少层,这十个数字就是对应的概率或者叫置信度。

3. 详细理解

全连接层的结构,全连接层中的每一层是由许多神经元组成的(1x 4096)的平铺结构,上图不明显,我们看下图

如何理解全连接层?

它是怎么样把3x3x5的输出,转换成1x4096的形式?

这里,我们可以理解为相当于它在中间做了一个卷积,如下图

        从上图我们可以看出,我们用一个 3x3x5 的 filter 去卷积激活函数的输出,得到的结果就是一个fully connected layer 的一个神经元的输出,这个输出就是一个值。因为我们有4096个神经元,我们实际就是用一个3x3x5x4096的卷积层去卷积激活函数的输出。

二、激活函数

1. 激活函数

        如果输入变化很小,导致输出结构发生截然不同的结果,这种情况是我们不希望看到的,为了模拟更细微的变化,输入和输出数值不只是0到1,可以是0和1之间的任何数,激活函数是用来加入非线性因素的,因为线性模型的表达力不够。        这句话字面的意思很容易理解,但是在具体处理图像的时候是什么情况呢?我们知道在神经网络中,对于图像,我们主要采用了卷积的方式来处理,也就是对每个像素点赋予一个权值,这个操作显然就是线性的。但是对于我们样本来说,不一定是线性可分的,为了解决这个问题,我们可以进行线性变化,或者我们引入非线性因素,解决线性模型所不能解决的问题。

2. 激活函数的种类

(1)Sigmoid函数

缺点:
∙ 饱和时梯度值非常小。由于BP算法反向传播的时候后层的梯度是以乘性方式传递到前层,因此当层数比较多的时候,传到前层的梯度就会非常小,网络权值得不到有效的更新,即梯度耗散。如果该层的权值初始化使得f(x) 处于饱和状态时,网络基本上权值无法更新。
∙ 输出值不是以0为中心值。

(2)Tanh函数

其中σ(x) 为sigmoid函数,仍然具有饱和的问题。

(3)ReLU函数

Alex在2012年提出的一种新的激活函数。该函数的提出很大程度的解决了BP算法在优化深层神经网络时的梯度耗散问题

优点:
∙ x>0 时,梯度恒为1,无梯度耗散问题,收敛快;
∙ 增大了网络的稀疏性。当x<0 时,该层的输出为0,训练完成后为0的神经元越多,稀疏性越大,提取出来的特征就越具有代表性,泛化能力越强。即得到同样的效果,真正起作用的神经元越少,网络的泛化性能越好
∙ 运算量很小;
缺点:
如果后层的某一个梯度特别大,导致W更新以后变得特别大,导致该层的输入<0,输出为0,这时该层就会‘die’,没有更新。当学习率比较大时可能会有40%的神经元都会在训练开始就‘die’,因此需要对学习率进行一个好的设置。
由优缺点可知max(0,x) 函数为一个双刃剑,既可以形成网络的稀疏性,也可能造成有很多永远处于‘die’的神经元,需要tradeoff。

(4)Leaky ReLU函数

改善了ReLU的死亡特性,但是也同时损失了一部分稀疏性,且增加了一个超参数,目前来说其好处不太明确

(5)Maxout函数

泛化了ReLU和Leaky ReLU,改善了死亡特性,但是同样损失了部分稀疏性,每个非线性函数增加了两倍的参数

真实使用的时候最常用的还是ReLU函数,注意学习率的设置以及死亡节点所占的比例即可。

3. 激活函数的比较

        这里插一句,来比较一下激活函数,因为神经网络的数学基础是处处可微的,所以选取的激活函数要能保证数据输入与输出也是可微的,运算特征是不断进行循环计算,所以在每代循环过程中,每个神经元的值也是在不断变化的。

        这就导致了tanh特征相差明显时的效果会很好,在循环过程中会不断扩大特征效果显示出来,但是,在特征相差比较复杂或是相差不是特别大时,需要更细微的分类判断的时候,sigmoid效果就好了。还有一个东西要注意,sigmoid 和 tanh作为激活函数的话,一定要注意一定要对 input 进行归一话,否则激活后的值都会进入平坦区,使隐层的输出全部趋同,但是 ReLU 并不需要输入归一化来防止它们达到饱和。

        构建稀疏矩阵,也就是稀疏性,这个特性可以去除数据中的冗余,最大可能保留数据的特征,也就是大多数为0的稀疏矩阵来表示。其实这个特性主要是对于Relu,它就是取的max(0,x),因为神经网络是不断反复计算,实际上变成了它在尝试不断试探如何用一个大多数为0的矩阵来尝试表达数据特征,结果因为稀疏特性的存在,反而这种方法变得运算得又快效果又好了。所以我们可以看到目前大部分的卷积神经网络中,基本上都是采用了ReLU 函数。

4. 激活函数应该具有的性质

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

目前常用的激活函数都只拥有上述性质的部分,没有一个拥有全部的。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐