什么是神经网络

人工神经网络(artificial neural network,ANN),简称神经网络(neural network,NN),是一种模仿生物神经网络的结构和功能的数学模型或计算模型。神经网络由大量的人工神经元联结进行计算。大多数情况下人工神经网络能在外界信息的基础上改变内部结构,是一种自适应系统。现代神经网络是一种非线性统计性数据建模工具,常用来对输入和输出间复杂的关系进行建模,或用来探索数据的模式。

神经网络由神经元、节点与节点之间的连接(突触)所构成,如下图:

CNN卷积核每次都相同_卷积核


每个神经网络单元抽象出来的数学模型如下,也叫感知器,它接收多个输入(x1,x2,x3…),产生一个输出,这就好比是神经末梢感受各种外部环境的变化(外部刺激),然后产生电信号,以便于转导到神经细胞(又叫神经元)。

CNN卷积核每次都相同_CNN卷积核每次都相同_02


单个的感知器就构成了一个简单的模型,但在现实世界中,实际的决策模型则要复杂得多,往往是由多个感知器组成的多层网络,如下图所示,这也是经典的神经网络模型,由输入层、隐含层、输出层构成。

CNN卷积核每次都相同_卷积核_03


人工神经网络可以映射任意复杂的非线性关系,具有很强的鲁棒性、记忆能力、自学习等能力,在分类、预测、模式识别等方面有着广泛的应用。

什么是卷积神经网络

卷积神经网络(Convolutional Neural Network, CNN)是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现。
卷积神经网络(Convolutional Neural Networks / CNNs / ConvNets)与普通神经网络非常相似,它们都由具有可学习的权重和偏置常量(biases)的神经元组成。每个神经元都接收一些输入,并做一些点积计算,输出是每个分类的分数,普通神经网络里的一些计算技巧到这里依旧适用。

卷积神经网络默认输入是图像,可以让我们把特定的性质编码入网络结构,使是我们的前馈函数更加有效率,并减少了大量参数

具有三维体积的神经元(3D volumes of neurons)

卷积神经网络利用输入是图片的特点,把神经元设计成三个维度 : width, height, depth(注意这个depth不是神经网络的深度,而是用来描述神经元的) 。比如输入的图片大小是 32 × 32 × 3 (rgb),那么输入神经元就也具有 32×32×3 的维度。
一个卷积神经网络由很多层组成,它们的输入是三维的,输出也是三维的,有的层有参数,有的层不需要参数。

传统神经网络:

CNN卷积核每次都相同_卷积核_04

卷积神经网络

CNN卷积核每次都相同_卷积_05

卷积神经网络组成

1、输入层

卷积神经网络的输入层可以处理多维数据,常见地,一维卷积神经网络的输入层接收一维或二维数组,其中一维数组通常为时间或频谱采样,二维数组可能包含多个通道;二维卷积神经网络的输入层接收二维或三维数组;三维卷积神经网络的输入层接收四维数组。
由于卷积神经网络在计算机视觉领域应用较广,因此许多研究在介绍其结构时预先假设了三维输入数据,即平面上的二维像素点和 RGB 通道。

与其它神经网络算法类似,由于使用梯度下降算法进行学习,卷积神经网络的输入特征需要进行标准化处理。具体地,在将学习数据输入卷积神经网络前,需在通道或时间/频率维对输入数据进行归一化,若输入数据为像素,也可将分布 [0,255] 的原始像素值归一化至 [0,1] 区间。输入特征的标准化有利于提升卷积神经网络的学习效率和表现。
在图像中局部范围内的像素之间联系较为紧密,而距离较远的像素则相关性较弱。因而,每个神经元其实没有必要对全局图像进行感知,只需要对局部进行感知,然后在更高层将局部的信息综合起来就得到了全局的信息。这种模式就是卷积神经网络中降低参数数目的重要神器:局部感受野

CNN卷积核每次都相同_卷积神经网络_06

该层要做的处理主要是对原始图像数据进行预处理,其中包括:

(1)去均值:把输入数据各个维度都中心化为0,如下图所示,其目的就是把样本的中心拉回到坐标系原点上
(2)归一化:幅度归一化到同样的范围,如下所示,即减少各维度数据取值范围的差异而带来的干扰,比如,我们有两个维度的特征A和B,A范围是0到10,而B范围是0到10000,如果直接使用这两个特征是有问题的,好的做法就是归一化,即A和B的数据都变为0到1的范围。

CNN卷积核每次都相同_CNN卷积核每次都相同_07


(3)PCA/白化:

用 PCA 降维

白化是对数据各个特征轴上的幅度归一化


CNN卷积核每次都相同_卷积核_08

2、卷积层(Convolutional layer)

卷积层由一组卷积单元(又称"卷积核")组成,可以把这些卷积单元的集合称为过滤器,每个过滤器都会提取一种特定的特征。

卷积层的功能是对输入数据进行特征提取,就是在原始输入上一个小区域一个小区域进行特征的提取。第一层卷积层可能只能提取一些低级的特征如边缘、线条和角等层级,更多层的网络能从低级特征中迭代提取更复杂的特征。

CNN卷积核每次都相同_卷积核_09


当给定一张新图时,CNN并不能准确地知道这些特征到底要匹配原图的哪些部分,所以它会在原图中把每一个可能的位置都进行尝试,相当于把这个feature(特征)变成了一个过滤器。这个用来匹配的过程就被称为卷积操作,这也是卷积神经网络名字的由来。

卷积特性

局部感知特性;
权值共享:卷积核在通一张图像中扫描过程中其权值保持不变

局部感知(Local Connectivity)与感受野

普通神经网络把输入层和隐含层进行“全连接(Full Connected)“的设计。从计算的角度来讲,相对较小的图像从整幅图像中计算特征是可行的。但是,如果是更大的图像(如 96x96 的图像),要通过这种全联通网络的这种方法来学习整幅图像上的特征,从计算角度而言,将变得非常耗时。你需要设计 10 的 4 次方(=10000)个输入单元,假设你要学习 100 个特征,那么就有 10 的 6 次方个参数需要去学习。与 28x28 的小块图像相比较, 96x96 的图像使用前向输送或者后向传导的计算方式,计算过程也会慢 10 的 2 次方(=100)倍。

卷积层解决这类问题的一种简单方法是对隐含单元和输入单元间的连接加以限制:每个隐含单元仅仅只能连接输入单元的一部分。例如,每个隐含单元仅仅连接输入图像的一小片相邻区域。每个隐含单元连接的输入区域大小叫神经元的感受野(receptive field)

CNN卷积核每次都相同_卷积_10

直观理解卷积

CNN卷积核每次都相同_卷积神经网络_11


以上图为例: 第一次卷积可以提取出低层次的特征,第二次卷积可以提取出中层次的特征,第三次卷积可以提取出高层次的特征。

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

(1)卷积核

卷积层内部包含多个卷积核,组成卷积核的每个元素都对应一个权重系数和一个偏差量(bias vector),每个卷积核的参数都是通过反向传播算法优化得到的,类似于一个前馈神经网络的神经元(neuron)。
卷积核在工作时,会有规律地扫过输入特征,在感受野内对输入特征做矩阵元素乘法求和并叠加偏差量。
卷积核越大,可提取的输入特征越复杂
卷积核用来检测某一个方面的特征,又称过滤器。多个卷积核就能提取多个方面的特征。

(2)卷积层参数

卷积层参数包括卷积核大小、步长和填充值,三者共同决定了卷积层输出特征图的尺寸,是卷积神经网络的超参数。其中卷积核大小可以指定为小于输入图像尺寸的任意值,卷积核越大,可提取的输入特征越复杂。

在达到相同感受野的情况下,卷积核越小,所需要的参数和计算量越小。具体来说。卷积核大小必须大于1才有提升感受野的作用,1排除了。而大小为偶数的卷积核即使对称地加padding也不能保证输入feature map尺寸和输出feature map尺寸不变(画个图算一下就可以发现),2排除了。所以一般都用3作为卷积核大小
卷积步长定义了卷积核相邻两次扫过特征图时位置的距离(窗口一次滑动的长度),卷积步长为1时,卷积核会逐个扫过特征图的元素,步长为n时会在下一次扫描跳过n-1个像素。
填充是在特征图通过卷积核之前人为增大其尺寸以抵消计算中尺寸收缩影响的方法。常见的填充方法为按0填充和重复边界值填充(replication padding)。填充依据其层数和目的可分为四类:有效填充(valid padding)、相同填充/半填充(same/half padding)、全填充(full padding)和任意填充(arbitrary padding)。Padding 这种操作是指我们对输入图片按照某种策略进行填充,使之成为更大的图片,这样做的一个目的在于使得卷积后的图片的大小和原始图片大小是一样的, 这样就不会使得图片在逐次的卷积操作中越变越小。一般采用Padding的策略都是constant填充,即用一个固定值来填充输入图片的四周。它可以帮助我们将更多的信息保存在图像的边界。如果没有填充,下一层的极少数值将受到像素边缘的影响。

CNN卷积核每次都相同_卷积_12

一个输出单元的大小有以下三个量控制:depth, stride 和 zero-padding。

深度(depth) : 顾名思义,它控制输出单元的深度,也就是filter的个数,连接同一块区域的神经元个数,又名depth column。
步幅(stride):它控制在同一深度的相邻两个隐含单元,与他们相连接的输入区域的距离。如果步幅很小(比如 stride = 1)的话,相邻隐含单元的输入区域的重叠部分会很多; 步幅很大则重叠区域变少。
补零(zero-padding) : 我们可以通过在输入单元周围补零来改变输入单元整体大小,从而控制输出单元的空间大小。

(3)多通道卷积

图片可以是多通道的,如RGB三个通道。所以,卷积操作也可以是多通道的卷积操作。

CNN卷积核每次都相同_CNN卷积核每次都相同_13


对于多个通道得到的多个结果,将多个结果进行线性相加,得到一个结果。

(4)多卷积核(多过滤器)

除了输入可能有多个通道外,进行卷积操作涉及的卷积核也可能有多个,这样得到的结果就会有多个,不同的卷积核会抽取不同的特征卷积核的个数决定输出图像的个数(通道数)

CNN卷积核每次都相同_卷积神经网络_14

(5)卷积的计算

滤器的每个内核在各自的输入通道上“滑动”,产生每个处理版本。

CNN卷积核每次都相同_卷积核_15


然后将每个通道处理的版本汇总在一起形成一个通道。过滤器的内核每个产生一个版本的每个通道,并且整个过滤器产生一个整体输出通道。


CNN卷积核每次都相同_池化_16

最后,这里有一个偏向的术语。这里偏置项的工作方式是每个输出滤波器都有一个偏置项。到目前为止,偏置被添加到输出通道以产生最终输出通道。

CNN卷积核每次都相同_卷积_17

示例

CNN卷积核每次都相同_池化_18

上图中:左区域的三个蓝色大矩阵是原式图像的输入,RGB三个通道用三个矩阵表示,大小为 7 * 7 * 3;色矩阵周围灰色的框是填充值;粉色矩阵就是卷积层的神经元,这里表示了有两个神经元(w0,w1),因此该卷积层结果的输出深度为2(绿色矩阵有2个);Bias b0是 Filter W0 的偏置项,Bias b1是 Filter W1 的偏置项;绿色矩阵就是经过卷积运算后的输出矩阵,这里的步长设置为2。
计算过程:

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

CNN卷积核每次都相同_卷积_19


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


CNN卷积核每次都相同_池化_20


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


CNN卷积核每次都相同_卷积_21


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


CNN卷积核每次都相同_CNN卷积核每次都相同_22


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


CNN卷积核每次都相同_池化_23

3、激活函数( Activation Function Layer)

激励函数操作通常在卷积核之后,把卷积层输出结果做非线性映射。一些使用预激活(preactivation)技术的算法将激励函数置于卷积核之前。

CNN卷积核每次都相同_卷积核_24


(1)为什么要用激活函数

所有的激活函数都是非线性的函数,如果一个模型没有激活函数的话,就相当于是所有线性过程的叠加,不论模型有多少层,叠加出来还是一个线性过程,也就是模型没有涉及非线性的因素,也就不会有实际的应用。而激活函数就是一个提供非线性过程的因子,有了激活函数我们才能完成一个非线性变化的过程
在生物意义上的神经元中,只有前面的树突传递的信号的加权和值大于某一个特定的阈值的时候,后面的神经元才会被激活。
简单的说激活函数的意义在于判定每个神经元的输出

CNN卷积核每次都相同_卷积核_25

有没有达到阈值。


放在人脸识别卷积神经网络中来思考,卷积层的激活函数的意义在于这一块区域的特征强度如果没有达到一定的标准,就输出0,表明这种特征提取方式(卷积核w)不能在该块区域提取到特征,或者说这块区域的这种特征很弱。由于输出0时,激活函数梯度几乎都为0,所以在特征很弱的区域,梯度几乎不下降,也就是说,和该特征无关的区域不会影响到该特征提取方式的训练。反过来说,如果没有激活函数,就算特征很弱时,仍然可以得到输出,后面的层次继续把这个输出当成一个特征使用,这是不合理的。

举例二分类问题:

现在有一个二分类问题,我们要将下面的三角形和圆点进行正确的分类,如图1所示。我们试着用神经网络解决这个问题。跟大家说明一下,这是一个线性不可分的问题,就是你在这个平面里,找不到一条直线可以把图中的三角形和圆点完全分开。

CNN卷积核每次都相同_卷积_26


总结:不带激活函数的单层感知机是一个线性分类器,不能解决线性不可分的问题。我们再设计一个神经网络,在所有的隐层和输出层加一个激活函数,这里激活函数我们就用 Sigmoid 函数,如图6所示。这样y输出的就是一个非线性函数了,y的输出更复杂,有了这样的非线性激活函数以后,神经网络的表达能力更加强大了。就能解决我们一开始提出的线性不可分问题。

我们通过最优化损失函数的做法,通过不断的学习,能够学到正确分类三角形和圆点的曲线。

CNN卷积核每次都相同_CNN卷积核每次都相同_27


总结:激活函数是用来加入非线性因素的,提高神经网络对模型的表达能力,解决线性模型所不能解决的问题

(2)常用的激活函数

CNN卷积核每次都相同_卷积神经网络_28


1)

Sigmoid

:Sigmoid 非线性激活函数的形式是σ(x)=1/(1+e−x),其图形如上图左所示。之前我们说过,sigmoid 函数输入一个实值的数,然后将其压缩到 0~1 的范围内。特别地,大的负数被映射成0,大的正数被映射成1。sigmoid function在历史上流行过一段时间因为它能够很好的表达“激活”的意思,未激活就是0,完全饱和的激活则是1。而现在sigmoid已经不怎么常用了,主要是因为它有两个缺点:

Sigmoid 容易饱和,并且当输入非常大或者非常小的时候,神经元的梯度就接近于0了,从图中可以看出梯度的趋势。这就使得我们在反向传播算法中反向传播接近于0的梯度,导致最终权重基本没什么更新,我们就无法递归地学习到输入数据了。另外,你需要尤其注意参数的初始值来尽量避免这一情况。如果你的初始值很大的话,大部分神经元可能都会处在饱和的状态而把梯度kill掉,这会导致网络变的很难学习。
Sigmoid 的输出不是 0 均值的,这是我们不希望的,因为这会导致后层的神经元的输入是非 0 均值的信号,这会对梯度产生影响:假设后层神经元的输入都为正(e.g. x>0 elementwise in f=wTx+b),那么对w求局部梯度则都为正,这样在反向传播的过程中w要么都往正方向更新,要么都往负方向更新,导致有一种捆绑的效果,使得收敛缓慢

(2)Tanh: Tanh 和 Sigmoid 是有异曲同工之妙的,它的图形如上图右所示,不同的是它把实值得输入压缩到 -1~1 的范围,因此它基本是0均值的,也就解决了上述 Sigmoid 缺点中的第二个,所以实际中 tanh 会比 sigmoid 更常用。但是它还是存在梯度饱和的问题。Tanh 是 sigmoid 的变形:tanh(x)=2σ(2x)−1。
(3)ReLU(The Rectified Linear Unit / 线性整流函数):它的数学表达式是:f(x)=max(0,x)。很显然,当输入 = < 0 时,输出为 0;输入 >0 时,输出等于输入。ReLU 的优点如下:

● 使用 ReLU 得到的 SGD 的收敛速度会比 sigmoid/tanh 快很多。有人说这是因为它是 linear,而且梯度不会饱和。(为什么线性不饱和,就会收敛的快?反向传播算法中,下降梯度等于敏感度乘以前一层的输出值,所以前一层输出越大,下降的梯度越多。该优点解决了sigmod的问题1的一部分)
● 相比于 sigmoid/tanh 需要计算指数等,计算复杂度高,ReLU 只需要一个阈值就可以得到激活值,梯度简单

ReLU 的缺点如下:

ReLU 在训练的时候很”脆弱”,一不小心有可能导致神经元”坏死”。举个例子:由于 ReLU 在 x<0 时梯度为 0,这样就导致负的梯度在这个 ReLU 被置零,而且这个神经元有可能再也不会被任何数据激活。如果这个情况发生了,那么这个神经元之后的梯度就永远是 0 了,也就是 ReLU 神经元坏死了,不再对任何数据有所响应。实际操作中,如果你的 learning rate 很大,那么很有可能你网络中的 40% 的神经元都坏死了。 当然,如果你设置了一个合适的较小的 learning rate,这个问题发生的情况其实也不会太频繁。
这个缺点类似sigmod问题1的另一部分,也就是说,如果在训练中某一次下降的太快,会导致该卷积核对要提取的特征要求过高,形象的说,就是变成了一个“完美主义”卷积核,所有形状都入不了它的眼,这样这个神经元就没用了,坏死了.

(4)

Leaky ReLU

:Leaky ReLUs 就是用来解决 ReLU 坏死的问题的。和 ReLU 不同,当x<0时,它的值不再是 0,而是一个较小斜率(如0.01等)的函数。也就是说 f(x)=1(x<0)(ax)+1(x>=0)(x),其中 a 是一个很小的常数。这样,既修正了数据分布,又保留了一些负轴的值,使得负轴信息不会全部丢失。关于Leaky ReLU 的效果,众说纷纭,没有清晰的定论。有些人做了实验发现 Leaky ReLU 表现的很好;有些实验则证明并不是这样。


Leaky ReLU 相当于对 sigmod 问题 2 有一定改善,更主要的是解决了 ReLu 的坏死问题,让坏了的神经元可以自我慢慢恢复,但是坏处就是,如果 a 过大,会丢失作为激活函数的原意。


CNN卷积核每次都相同_卷积神经网络_29

激励层的实践经验:

①不要用 sigmoid!不要用 sigmoid!不要用 sigmoid!   
② 首先试 RELU,因为快,但要小心点   
③ 如果 2 失效,请用 Leaky ReLU 或者 Maxout   
④ 某些情况下 tanh 倒是有不错的结果,但是很少

4、卷积池化层(Pooling Layer)

池化(pool)即下采样(downsamples),就是将输入图像进行缩小,池化减少像素信息,只保留重要信息,目的是为了减少特征图。通常在卷积层之后会得到维度很大的特征,将特征切成几个区域,取其最大值或平均值,得到新的、维度较小的特征。
池化层夹在连续的卷积层中间, 用于压缩数据和参数的量,减小过拟合。如果输入是图像的话,那么池化层的最主要作用就是压缩图像。
在卷积层进行特征提取后,输出的特征图会被传递至池化层进行特征选择和信息过滤。池化层包含预设定的池化函数,其功能是将特征图中单个点的结果替换为其相邻区域的特征图统计量。池化层选取池化区域与卷积核扫描特征图步骤相同,由池化大小、步长和填充控制

池化层的具体作用

特征不变性,也就是我们在图像处理中经常提到的特征的尺度不变性,池化操作就是图像的resize,平时一张狗的图像被缩小了一倍我们还能认出这是一张狗的照片,这说明这张图像中仍保留着狗最重要的特征,我们一看就能判断图像中画的是一只狗,图像压缩时去掉的信息只是一些无关紧要的信息,而留下的信息则是具有尺度不变性的特征,是最能表达图像的特征。
特征降维,我们知道一幅图像含有的信息是很大的,特征也很多,但是有些信息对于我们做图像任务时没有太多用途或者有重复,我们可以把这类冗余信息去除,把最重要的特征抽取出来,这也是池化操作的一大作用。
● 在一定程度上防止过拟合,更方便优化。

CNN卷积核每次都相同_卷积_30

池化层运算的种类

池化的操作也很简单,通常情况下,池化区域是2*2大小,然后按一定规则转换成相应的值。
池化层进行的运算一般有以下几种:
最大池化(Max Pooling)。取4个点的最大值。这是最常用的池化方法。
均值池化(Mean Pooling)。取4个点的均值。
● 高斯池化。借鉴高斯模糊的方法。不常用。
● 可训练池化。训练函数 ff ,接受4个点为输入,出入1个点。不常用。

最常见的池化层是规模为2*2, 步幅为2,对输入的每个深度切片进行下采样。每个MAX操作对四个数进行,如下图所示:

CNN卷积核每次都相同_池化_31

池化操作保持深度大小不变
如果池化层的输入单元大小不是二的整数倍,一般采取边缘补零(zero-padding)的方式补成2的倍数,然后再池化

5、全连接层(fully-connected layer)——分类

CNN卷积核每次都相同_CNN卷积核每次都相同_32


全连接层有两层1x4096fully connected layer 平铺结构(有些网络结构有一层的,或者二层以上的),全连接层中一层的一个神经元就可以看成一个多项式,我们用许多神经元去拟合数据分布,只用一层fully connected layer 有时候没法解决非线性问题,而如果有两层或以上fully connected layer就可以很好地解决非线性问题了。全连接层中的每一层是由许多神经元组成的(1x 4096)的平铺结构:

CNN卷积核每次都相同_CNN卷积核每次都相同_33


CNN卷积核每次都相同_池化_34


理解全连接层

CNN卷积核每次都相同_CNN卷积核每次都相同_35


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


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


CNN卷积核每次都相同_卷积_36


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

(1)全连接层的作用

全连接层之前的作用是提取特征;全连接层的作用是分类
全连接连接所有的特征,将输出值送给分类器 (如 softmax 分类器),其将卷积输出的二维特征图转化成 (N * 1)一维的一个向量

CNN卷积核每次都相同_池化_37


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


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

(2)全连接层之前的向量展平

在全连接层之前的所有层中,特征都是使用矩阵表示的,所以再传入全连接层之前还需要对特征进行压扁,将他这些特征变成一维的向量,如果要进行分类的话,就是用 sofmax 作为输出,如果要是回归的话就直接使用linear即可。

(3)全连接层与卷积层

全连接层(fully connected layers,FC)在整个卷积神经网络中起到“分类器”的作用。如果说卷积层、池化层和激活函数层等操作是将原始数据映射到隐层特征空间的话,全连接层则起到将学到的“分布式特征表示”映射到样本标记空间的作用
在实际使用中,全连接层可由卷积操作实现:对前层是全连接的全连接层可以转化为卷积核为 1x1 的卷积;而前层是卷积层的全连接层可以转化为卷积核为 h * w 的全局卷积,h 和 w 分别为前层卷积结果的高和宽。
实际上,全连接层也可以被视为是一种极端情况的卷积层,其卷积核尺寸就是输入矩阵尺寸,因此输出矩阵的高度和宽度尺寸都是1

CNN卷积核每次都相同_卷积核_38

(4)全连接层的弊端

● 由于全连接层的参数十分冗余(仅全连接层参数就可占整个网络参数80%左右),因此现在的趋势是尽量避免全连接。目前主流的一个方法是全局平均值,也就是最后那一层的feature map(最后一层卷积的输出结果),直接求平均值。有多少种分类就训练多少层,这十个数字就是对应的概率或者叫置信度。

● 一些性能优异的网络模型如 ResNet 和 GoogLeNet 等均用全局平均池化(global average pooling,GAP)取代 FC 来融合学到的深度特征,最后仍用 softmax 等损失函数作为网络目标函数来指导学习过程。需要指出的是,用 GAP 替代 FC 的网络通常有较好的预测性能。

FC 可在模型表示能力迁移过程中充当“防火墙”的作用。具体来讲,假设在ImageNet上预训练得到的模型为 ,则ImageNet可视为源域(迁移学习中的source domain)。微调(fine tuning)是深度学习领域最常用的迁移学习技术。针对微调,若目标域(target domain)中的图像与源域中图像差异巨大(如相比ImageNet,目标域图像不是物体为中心的图像,而是风景照,见下图),不含FC的网络微调后的结果要差于含FC的网络。因此 FC 可视作模型表示能力的“防火墙”,特别是在源域与目标域差异较大的情况下,FC可保持较大的模型 capacity 从而保证模型表示能力的迁移。(冗余的参数并不一无是处。)(论文:In Defense of Fully Connected Layers in Visual Representation Transfer)

(5)全连接层和卷积层可以相互转换:

对于任意一个卷积层,要把它变成全连接层只需要把权重变成一个巨大的矩阵,其中大部分都是0, 除了一些特定区块(因为局部感知),而且好多区块的权值还相同(由于权重共享)。
相反地,对于任何一个全连接层也可以变为卷积层。比如,一个 的全连接层,输入层大小为 ,它可以等效为一个 的卷积层。换言之,我们把 filter size 正好设置为整个输入层大小。

(6)全连接层对模型的影响

全连接层的组成如下:

CNN卷积核每次都相同_池化_39


二层全连接层结构,那么全连接层对模型影响参数就是三个:

● 全接解层的总层数(长度)
● 单个全连接层的神经元数(宽度)
● 激活函数(增加模型的非线性表达能力)

如果全连接层宽度不变,增加长度:

● 优点:神经元个数增加,模型复杂度提升;全连接层数加深,模型非线性表达能力提高。理论上都可以提高模型的学习能力。

如果全连接层长度不变,增加宽度:

● 优点:神经元个数增加,模型复杂度提升。理论上可以提高模型的学习能力。 难度长度和宽度都是越多越好?肯定不是
● 缺点:学习能力太好容易造成过拟合;运算时间增加,效率变低。

那么怎么判断模型学习能力如何?

看Training Curve 以及 Validation Curve:
● 在其他条件理想的情况下,如果Training Accuracy 高, Validation Accuracy 低,也就是过拟合了,可以尝试去减少层数或者参数。
● 如果Training Accuracy 低,说明模型学的不好,可以尝试增加参数或者层数。至于是增加长度和宽度,这个又要根据实际情况来考虑了。

(7)demo 说明

区别一图片是不是猫

CNN卷积核每次都相同_卷积核_40


假设这个神经网络模型已经训练完了,全连接层已经知道。


CNN卷积核每次都相同_卷积_41


当我们得到以上特征,我就可以判断这个东东是猫了,因为全连接层的作用主要就是实现分类(Classification)。 从下图,我们可以看出:


CNN卷积核每次都相同_CNN卷积核每次都相同_42


红色的神经元表示这个特征被找到了(激活了),同一层的其他神经元,要么猫的特征不明显,要么没找到。

当我们把这些找到的特征组合在一起,发现最符合要求的是猫,ok,我认为这是猫了。

那我们现在往前走一层,那们现在要对子特征分类,也就是对猫头,猫尾巴,猫腿等进行分类。比如我们现在要把猫头找出来:


CNN卷积核每次都相同_池化_43


猫头有这么些个特征,于是我们下一步的任务,就是把猫头的这么些子特征找到,比如眼睛啊,耳朵啊。


CNN卷积核每次都相同_卷积_44


道理和区别猫一样,当我们找到这些特征,神经元就被激活了(上图红色圆圈)。

这细节特征又是怎么来的?就是从前面的卷积层和下采样层来的。

6、输出层

卷积神经网络中输出层的上游通常是全连接层,因此其结构和工作原理与传统前馈神经网络中的输出层相同。对于图像分类问题,输出层使用逻辑函数或归一化指数函数(softmax function)输出分类标签。在物体识别(object detection)问题中,输出层可设计为输出物体的中心坐标、大小和分类。在图像语义分割中,输出层直接输出每个像素的分类结果。

卷积神经网络架构

常见的卷积神经网络架构是这样的:

INPUT -> [[CONV -> RELU]*N -> POOL?]*M -> [FC -> RELU]*K -> FC

堆叠几个卷积和整流层,再加一个池化层,重复这个模式知道图片已经被合并得比较小了,然后再用全连接层控制输出
上述表达式中 ? 意味着0次或1次,通常情况下:N >= 0 && N <= 3, M >= 0, K >= 0 && K < 3。

比如你可以组合出以下几种模式:

● INPUT -> FC, 实现了一个线性分类器, 这里 N = M = K = 0 ;
● INPUT -> CONV -> RELU -> FC ;
● INPUT -> [CONV -> RELU -> POOL]*2 -> FC -> RELU -> FC;Here we see that there is a single CONV layer between every POOL layer.
● INPUT -> [CONV -> RELU -> CONV -> RELU -> POOL]*3 -> [FC -> RELU]*2 -> FC ;Here we see two CONV layers stacked before every POOL layer. This is generally a good idea for larger and deeper networks, because multiple stacked CONV layers can develop more complex features of the input volume before the destructive pooling operation.

卷积网络的设计公式

(1)卷积层的填充(padding)公式

CNN卷积核每次都相同_CNN卷积核每次都相同_45


(2)计算卷积层输出大小的公式

CNN卷积核每次都相同_卷积核_46


(3)计算卷积后参数个数

CNN卷积核每次都相同_CNN卷积核每次都相同_47


(4)计算池化层输出大小的公式

CNN卷积核每次都相同_卷积_48