导航:首页 > 网络安全 > 卷积神经网络算法如何解决过拟合

卷积神经网络算法如何解决过拟合

发布时间:2023-08-10 22:52:27

⑴ 深度学习为什么不过拟合

深度学习:过拟合

为了得到一致假设而使假设变得过度复杂称为过拟合。想象某种学习算法产生了一个过拟合的分类器,这个分类器能够百分之百的正确分类样本数据(即再拿样本中的文档来给它,它绝对不会分错),但也就为了能够对样本完全正确的分类,使得它的构造如此精细复杂,规则如此严格,以至于任何与样本数据稍有不同的文档它全都认为不属于这个类别。
标准定义:给定一个假设空间H,一个假设h属于H,如果存在其他的假设h’属于H,使得在训练样例上h的错误率比h’小,但在整个实例分布上h’比h的错误率小,那么就说假设h过度拟合训练数据。 —-《Machine Learning》Tom M.Mitchell

假设我们用深度学习来判断西瓜,过拟合会使得你判断西瓜更加严厉,导致在某些西瓜数据上与你准备的数据有些出入(差别并不会太大),从而结果判定不是西瓜。。。

-----------------
深度学习防止过拟合的方法

过拟合即在训练误差很小,而泛化误差很大,因为模型可能过于的复杂,使其”记住”了训练样本,然而其泛化误差却很高,在传统的机器学习方法中有很大防止过拟合的方法,同样这些方法很多也适合用于深度学习中,同时深度学习中又有一些独特的防止过拟合的方法,下面对其进行简单的梳理.
1. 参数范数惩罚
范数正则化是一种非常普遍的方法,也是最常用的方法,假如优化:

minObj(θ)=L(y,f(x))+αG(θ)

其中L为经验风险,其为在训练样本上的误差,而G为对参数的惩罚,也叫结构风险.α是平衡两者,如果太大则对应的惩罚越大,如过太小,甚至接近与0,则没有惩罚.
最常用的范数惩罚为L1,L2正则化,L1又被成为Lasso:

||w||1=|w1|+|w2|+...

即绝对值相加,其趋向于是一些参数为0.可以起到特征选择的作用.
L2正则化为:

||w||2=w12+w22+...−−−−−−−−−−−−√

其趋向与,使权重很小.其又成为ridge.
关于更多可以参考:机器学习中的范数规则化之(一)L0、L1与L2范数

2. 数据增强
让模型泛化的能力更好的最好办法就是使用更多的训练数据进行训练,但是在实践中,我们拥有的数据是有限的,解决这一问题可以人为的创造一些假数据添加到训练集中.
一个具体的例子:
在AlexNet中,将256*256图像随机的截取224*224大小,增加了许多的训练样本,同时可以对图像进行左右翻转,增加样本的个数,实验的结果可以可降低1%的误差.
在神经网络中输入噪声也可以看做是数据增强的一种方式.
3. 提前终止
如下图所示(图片来源deep learning),当随着模型的能力提升,训练集的误差会先减小再增大,这样可以提前终止算法减缓过拟合现象.关于算法的具体流程参考deep learning.

提前终止是一种很常用的缓解过拟合的方法,如在决策树的先剪枝的算法,提前终止算法,使得树的深度降低,防止其过拟合.
4. 参数绑定与参数共享
在卷积神经网络CNN中(计算机视觉与卷积神经网络 ),卷积层就是其中权值共享的方式,一个卷积核通过在图像上滑动从而实现共享参数,大幅度减少参数的个数,用卷积的形式是合理的,因为对于一副猫的图片来说,右移一个像素同样还是猫,其具有局部的特征.这是一种很好的缓解过拟合现象的方法.
同样在RNN中用到的参数共享,在其整条时间链上可以进行参数的共享,这样才使得其能够被训练.
5. bagging 和其他集成方法
其实bagging的方法是可以起到正则化的作用,因为正则化就是要减少泛化误差,而bagging的方法可以组合多个模型起到减少泛化误差的作用.
在深度学习中同样可以使用此方法,但是其会增加计算和存储的成本.
6. Dropout
Dropout提供了一种廉价的Bagging集成近似,能够训练和评估指数级数量的神经网络。dropout可以随机的让一部分神经元失活,这样仿佛是bagging的采样过程,因此可以看做是bagging的廉价的实现.
但是它们训练不太一样,因为bagging,所有的模型都是独立的,而dropout下所有模型的参数是共享的.
通常可以这样理解dropout:假设我们要判别一只猫,有一个神经元说看到有毛就是猫,但是如果我让这个神经元失活,它还能判断出来是猫的话,这样就比较具有泛化的能力,减轻了过拟合的风险.
7. 辅助分类节点(auxiliary classifiers)
在Google Inception V1中,采用了辅助分类节点的策略,即将中间某一层的输出用作分类,并按一个较小的权重加到最终的分类结果中,这样相当于做了模型的融合,同时给网络增加了反向传播的梯度信号,提供了额外的正则化的思想.
8. Batch Normalization
在Google Inception V2中所采用,是一种非常有用的正则化方法,可以让大型的卷积网络训练速度加快很多倍,同事收敛后分类的准确率也可以大幅度的提高.
BN在训练某层时,会对每一个mini-batch数据进行标准化(normalization)处理,使输出规范到N(0,1)的正太分布,减少了Internal convariate shift(内部神经元分布的改变),传统的深度神经网络在训练是,每一层的输入的分布都在改变,因此训练困难,只能选择用一个很小的学习速率,但是每一层用了BN后,可以有效的解决这个问题,学习速率可以增大很多倍.
未完待续…
参考资料:
deep learning
tensorflow实战
机器学习中的范数规则化之(一)L0、L1与L2范数

⑵ 卷积神经网络——卷积层、池化层和激活函数

2018年11月20日,在看tensorflow的时候发现还是有很多概念没有理解透彻,发现一个很赞的资源(估计大家都知道的,只有我现在才发现),吴恩达老师在网易云课堂上开的深度学习的 课程 ,感觉很赞.本文实际上是吴恩达卷积神经网络视频学习笔记。

2019年2月14日,再次温故这部分的内容,添加了1.1章节的自问自答,添加了对池化层实现反向传播的方式,添加了激活函数relu和sigmoid的对比。

通过一个3 * 3的每列值相同、第一列为1,第二列为0,第三列为-1的过滤器可以检测垂直的边沿。注意到1表示亮,-1表示暗。这样可以发现正负值的边沿。
对于垂直边缘过滤器而言,重要的是中间一列为0,左右两列的值可以相差尽可能的大。
这个过滤器的数值也是可以通过反向传播皮运行算法学习的,不一定需要在算法开始之前就决定。
深度学习甚至可以去学习其他的边沿,无论是45度、73度乃至是其他的角度,虽然比手工要复杂一些,但是确实具有这样的能力。

为什么需要填充?大家都知道,卷积就是用过滤器(f x f)从左到右、从上到下的扫描一个矩阵(n x n)。有两种卷积操作,一种称为valid-conv,一种称为same-conv。每次卷积的时候,过滤器右侧碰到矩阵右边界就结束当前行的扫描,下侧碰到矩阵下边界就结束扫描,因此通过过滤器的图像都会缩小,变为(n-f+1) * (n-f+1)。valid-conv就是这样的卷积操作,而same-conv会在卷积之前填充原始图,使得卷积之后的大小不变。

一般来说燃哗,若原图像大小为n * n,过滤器大小为f * f,那么需要padding的大小为p=(f-1)/2。一般来说我们会设置f为奇数,很少看见偶数的过滤器。其中的原因之一就是为了对称填充。另一个原因可能是一般需要将过滤器的中间点用于定位卷积的位置,而偶数过滤器没有中间点。

上面的提到的卷积过程每次只移动一步。实际上过滤器可以移动不止一步,用s表示步长。那么n x n的矩阵输入, f x f的过滤器, p填充padding,以及s步长的情况下,输出的矩阵大小为 (n+2p-f)/2+1 x (n+2p-f)/2+1 ,这里是向下取整的,这意味过滤器只能在输入图像内部移动,不可以移动出边缘。

注意 在tensorflow中,有两种填充方式,一种是same,一种是valid。same是填充,而valid是不填充。如果遇到valid,那么实际计算矩阵大小的时候,是向上取悄袜整,而不是这里提到的向下取整。如果是same模式,那么最后的矩阵形状是n/s,也是向上取整

上面提到的卷积的输入是n x n的,这一般是灰度图像。对应彩色图像则存在RGB三个颜色channel,这样的图片是n x n x 3。此时的过滤器也必须存在第三个维度,即channel维度,且一个过滤器的channel维度必须和输入的channel维度一致。这样的卷积结果就是三个维度上,过滤器和输入的重叠位置乘积之和。最后的输出是(n - f + 1) x ( n - f +1)的。 注意,输出是二维的

我们可以使用N个不同的过滤器得到不同的N个二维输出,按照输入的格式将其叠起来,这样输出就是 (n - f + 1) x ( n - f +1) x N了。

在上面一节中已经讲了如何得到输入和一个过滤器卷积之后的结果。通常会给卷积的结果添加一个偏执,然后使用非线性的函数进行处理,得到的就是这层网络的输出。将过滤器的参数标记为W,偏置为 b(一个channel的输出矩阵Wa的偏置是一个实数,而非一个矩阵。一个layer的偏置b的维度和通道数channel一致) , 输入数据为上层的激活值。这样每个过滤器处理之后的结果就可以看成是经过了该layer一个节点之后的输出。

下面是每层的符号标记,以及根据上一层计算下一层输入大小的公式,右下角是使用BP学习更新的时候参数更新的次数。可以看到每层的参数的个数只和这层的filter的大小、数目有关,而和输入的规模无关。这样就可以通过控制参数的数量避免过拟合了。

可以从下面的课件中看到,卷积神经网络的趋势是长度和高度逐渐减少,而channel逐渐加深。最后一层会将卷积层平铺开来,形成一个全连接。全连接层会连接到最后一个判别函数上,判别函数可以是logistic或者softmax层,用于输出类别或者概率。

一般情况下,卷积网络除了卷积层之外,还会有池化层和全连接层,这些层可以提供更好的学习。

池化层一般在卷积层之后,可以也可以看成一个过滤器,实际上实现的一个采样的功能,其主要的思想是,着重提取具有某种倾向的特征,比如最大池化对应的是更显着的特征;平均池化对应的是更加平滑的特征。过滤器有几点不同

一般常用的池化层有max_pooling和average_pooling.max_pooling更加常用。 ,最大池化层意味着检测某个特征,并始终将这个特征留在池化层的输出中

池化层的输入n x n x nc,过滤器 f x f,步长s,输出 ((n-f)/s+1) x ((n-f)/s+1) * nc。
一般取s=2,这意味着输入的长宽减小一半。

比较好奇的一个问题是,池化层的存在对反向传播有什么影响?我们都知道在传统的神经网络中,反向传播算法实际上就是利用函数的梯度进行反向传播的,那么池化层这种既改变了矩阵大小又不好求导的情况,怎么处理呢?
(下面的内容来自 迷川浩浩_ZJU 的博客 )

mean pooling的前向传播就是把一个patch中的值求取平均来做pooling,那么反向传播的过程也就是把某个元素的梯度等分为n份分配给前一层,这样就保证池化前后的梯度(残差)之和保持不变,还是比较理解的。mean pooling比较容易让人理解错的地方就是会简单的认为直接把梯度复制N遍之后直接反向传播回去,但是这样会造成loss之和变为原来的N倍,网络是会产生梯度爆炸的。

2、max pooling

max pooling也要满足梯度之和不变的原则,max pooling的前向传播是把patch中最大的值传递给后一层,而其他像素的值直接被舍弃掉。那么反向传播也就是把梯度直接传给前一层某一个像素,而其他像素不接受梯度,也就是为0。所以max pooling操作和mean pooling操作不同点在于需要记录下池化操作时到底哪个像素的值是最大,也就是max id

一般概念上的一层包括卷积层和池化层,之所以不把池化层当做新的一层是因为池化层没有需要学习的参数,一般意义上的layer是有权重和参数需要学习的。

尽量不要自己设置超参数,而是尽量参考别人论文里面使用的超参数,选择一个在别人任务中效果很好的超参数。

下面的表中列举了上面的网络每一层的数据规模a^(l)以及参数数量。可以发现数据的规模逐渐减小。主卷积层的参数比较少,而进入全连接层之后参数数量很大。(表格中最后三列的参数数量可能存在错误,应该是48000 + 120, 120 * 84 + 84, 84 * 10 + 10)

以上的两个特征可以明显的减少参数。减少过拟合

(内容来自 迷川浩浩_ZJU 的博客 )
常用的激活函数有sigmoid函数和relu函数.
Relu(x)={if x>0 then x;else 0}为了在反向传播算法中可以正常使用,将其在x=0x=0处的导数置为1,所以它的导数也就变为了 δRelu(x)={if x>0 then 1 else 0}
Relu是一个非常优秀的激活哈数,相比较于传统的Sigmoid函数,有三个作用

⑶ 如何更好的理解分析深度卷积神经网络

作者:杨延生
链接:
来源:知乎
着作权归作者所有,转载请联系作者获得授权。

"深度学习"是为了让层数较多的多层神经网络可以训练,能够work而演化出来的一系列的 新的结构和新的方法。

新的网络结构中最着名的就是CNN,它解决了传统较深的网络参数太多,很难训练的问题,使用了逗局部感受野地和逗权植共享地的概念,大大减少了网络参数的数量。关键是这种结构确实很符合视觉类任务在人脑上的工作原理。
新的结构还包括了:LSTM,ResNet等。

新的方法就多了:新的激活函数:ReLU,新的权重初始化方法(逐层初始化,XAVIER等),新的损失函数,新的防止过拟合方法(Dropout, BN等)。这些方面主要都是为了解决传统的多层神经网络的一些不足:梯度消失,过拟合等。

---------------------- 下面是原答案 ------------------------

从广义上说深度学习的网络结构也是多层神经网络的一种。

传统意义上的多层神经网络是只有输入层、隐藏层、输出层。其中隐藏层的层数根据需要而定,没有明确的理论推导来说明到底多少层合适。
而深度学习中最着名的卷积神经网络CNN,在原来多层神经网络的基础上,加入了特征学习部分,这部分是模仿人脑对信号处理上的分级的。具体操作就是在原来的全连接的层前面加入了部分连接的卷积层与降维层,而且加入的是一个层级。
输入层 - 卷积层 -降维层 -卷积层 - 降维层 -- .... -- 隐藏层 -输出层
简单来说,原来多层神经网络做的步骤是:特征映射到值。特征是人工挑选。
深度学习做的步骤是 信号->特征->值。 特征是由网络自己选择。

⑷ 神经网络:欠拟合和过拟合

以我们前面讲述的线性回归为例,比如我们在训练集上训练出最优的模型,但是当我们将其使用到测试集时,测试的误差很大,我们该怎么办? 

我们一般采取的措施主要包括以下6种:

增加训练样本的数目(该方法适用于过拟合现象时,解决高方差。一般都是有效的,但是代价较大,如果下面的方法有效,可以优先采用下面的方式);

尝试减少特征的数量(该方法适用于过拟合现象时,解决高方差);

尝试获得更多的特征(该方法适用于欠拟合现象时,解决高偏差);

尝试增加多项式特征(该方法适用于欠拟合现象时,解决高偏差);

尝试减小正则化程度λ(该方法适用于欠拟合现象时,解决高偏差);

尝试增加正则化程度λ(该方法适用于过拟合现象时,解决高方差);

上面的方法不是随机选择,是在合适的情况下(过拟合和欠拟合)选择合适的方法,对于怎么判断一个模型是过拟合还是欠拟合,我们会在下面给出一些机器学习诊断法。

如何对一个假设进行评估?  

我们前面在讲述线性回归和逻辑回归时,只是注重针对训练数据集训练出一个最优的参数,但是我们训练处的模型对于测试集的性能好坏我们没有进行判断,我们只是训练的模型使得损失函数最小,我们前面也讨论过,在训练数据集上损失函数最小并不能代表对于给定的测试数据,测试数据的评估非常准确,比如过拟合现象发生时,那我们如何评价一个假设的好坏呢? 

主要的方法包括两种: 

1.对于简答的模型,我们可以采用将hθ(x)的图像画出,来判断模型的好坏,但是这种方法对于特征变量不是一个时,这种方法很难实现或者不可能实现。例如我们曾经看到过这样的图像,可以通过hθ(x)的图像明显可以看出,该假设存在着过拟合现象。 

2.另一种评估假设的方法为:将原来的数据集分为训练集和测试集,一般我们是从原来的数据集中随机选取(保证训练集和测试集中都含有各种类型的数据)70%的数据作为训练集,剩下的30%的样本作为测试集。同时这种将原来数据集划分为训练集和测试集的方法可以用于帮助特征选择、多项式次数的选择以及正则化参数的选择等。数据集划分的过程如下: 

以上面数据集为例,选取前7个为训练集,后3个为测试集。用前7个数据集做训练训练出一个最优的模型,评价这个训练出的模型的好坏可以使用测试集来进行判断,判断的标准可以使用测试集的损失函数来进行定量的衡量。 

对于回归问题,测试集的损失函数计算公式如下: 

Jtest(θ)=12mtest∑i=1mtest(hθ(x(i)test)−y(i)test)2

而对于分类问题,测试集的损失函数计算公式如下: 

这种测量方式,如果测试样本损失函数很大,则代表训练出的模型泛化能力不好。 

对于分类问题,还有另外一种测量的方式,称为误分类率,它对于每一个测试样本进行计算,计算的公式如下: 

error=1mtest∑i=1mtesterr(hθ(x(i)test),y(i)))

其中, 

模型的选择和交叉验证集:  

上述我们是在模型选择好了之后进行训练的,也就是上述我们都是确定了假设进行训练的,但是我们怎么对模型进行选择呢,这一节我们来讨论一下模型的选择,以及和交叉验证集的关系。 

模型选择主要包括以下内容:1.怎样选择正确的特征来构造学习算法?2.怎样选择学习算法中正则化参数λ?等问题。 

首先我们结合一个例子来引出模型的选择和验证集: 

例如我们有上面十个模型,我们对于给定的数据集选择哪种模型呢?按照我们上面讨论的将数据集划分为训练集和测试集,使用训练集对上述模型进行训练,然后使用测试集来进行选择最佳的模型,比如最优的为第五个模型,但是这并不能衡量这个模型的泛化能力,因为测试集已经用于选择最优的模型,这个模型对于其他未知数据的泛化能力还是未知的。 

所以针对上述问题我们可以将数据集划分为训练集、交叉验证集和测试集。一般情况下,训练集占总样本的60%,交叉验证集占20%,测试集占20%。其中训练集用于训练,交叉验证集用于选择最优的模型,测试集用于测试模型的泛化能力。 

模型选择方法为: 

1. 使用训练集训练10个模型; 

2. 用10个模型分别对交叉验证集计算出交叉验证误差(代价函数的值),其中计算公式为: 

3. 选取交叉验证误差最小的模型作为选择的模型; 

4. 用测试集对选择出的模型计算泛化能力(测试样本的损失函数),计算公式如上文中讨论的一样。

假设对诊断偏差和方差(即过拟合还是欠拟合)的影响  

利用上述方法学习到的算法性能不好一般会有两种情况: 

1.会出现过拟合,也就是所谓的方差很大; 

2.会出现欠拟合,也就是所谓的偏差很大; 

首先应该确定算法性能的不好,是由哪种原因造成的,然后针对不同的情况采取不同的改进策略,可以有效的改进当前的算法。下面我们来讲述一下怎么判断是过拟合还是欠拟合。 

以下面例子为例,来进行讨论: 

我们可以通过绘制出训练集的代价函数和交叉验证验证集的代价函数与方次d的关系来进行判断是上述哪种情况的一种: 

对于训练集,当d较小时,模型的拟合程度不是很好,所以训练样本集的代价函数比较大;随着d的增加,模型的拟合程度不断提高,代价函数不断的减小; 

对于交叉验证集,由于d比较小时,模型的拟合程度不是很好,对于新来的样本预测结果会偏差很大,所以交叉验证集的代价函数在初始阶段会很大,而随着d的增加会出现一个比较好的方次d,使得模型的拟合程度最佳,同时对于新来的样本泛化能力很强,所以会有一个代价函数最小的点出现(该转折点即是模型开始由欠拟合转向过拟合的点),随后随着d的增加,由于过拟合,会存在对新的样本预测结果不良的现象,所以代价函数会逐渐增大。 

当我们绘制出上述曲线时,我们就可以判断出什么时候是过拟合什么时候欠拟合,判断的标准如下: 

1. 当训练误差与交叉验证集误差接近时,并且都很大时,该模型高偏差(欠拟合); 

2. 当训练误差远小于验证集误差时,并且训练误差很小时,该模型高方差(过拟合)。 

判断出该模型是过拟合或者欠拟合之后,然后使用上述提到的过拟合和欠拟合的解决方法,对算法进行改进。

正则化对偏差和方差的影响  

我们前面讲述过正则化可以有效的处理过拟合现象,但是我们上述所说的处理过拟合是在合适的λ情况下,那么λ值的大小对模型的性能是怎样影响的呢?我们采用上述与方次d对性能的影响相同的方式来分析λ的值对性能的影响。 

我们首先选择一系列的λ值,通常λ的选择是0~10之间呈现二倍关系的值(如:0,0.01,0.02,0.04,0.08,0.15,0.32,0.64,1.28,5.26,5.12,10) 

构建方式如下: 

选择λ的方法如下: 

1.使用训练集训练处12个不同程度正则化模型; 

2.用12个模型分别对交叉验证集计算出交叉验证误差; 

3.选择得出交叉验证误差最小的模型; 

4.运用步骤3选出的模型对测试集计算得出推广误差

我们同样可以将训练集和交叉验证集模型的代价函数与λ的值绘制在一张图上。对于训练集、验证集和测试集的代价函数计算公式为: 

需要注意的是,当计算训练集、交叉验证集和测试集误差时,不计算正则项,然后绘制出训练集和交叉验证集代价函数与λ值的关系,如下图所示: 

1. 当λ较小时,训练误差较小(过拟合)而交叉验证集误差较大; 

2. 随着λ的增加(从过拟合到欠拟合的过程),训练集误差逐渐增大(欠拟合),而交叉验证集误差则是先减小后增大。

学习曲线  

学习曲线也是一种可以判断算法是否处于过拟合还是欠拟合的情况,学习曲线是将训练集误差和交叉验证集误差作为训练集实例数量(m)的函数绘制的图像。学习曲先不仅可以帮助我们是不是处于过拟合或者欠拟合,它还可以帮助我们判断是否为了提高算法的性能需要我们收集多的数据。 

假设我们有100行数据,我们从第一行数据开始,逐渐增加数据进行训练,得到每次训练数据的代价函数值。当数据很少时,训练模型能够非常完美的拟合很少的数据,但是训练出的模型却不能泛化其他的数据,所以当数据很少时,训练集的代价函数很小,但是交叉验证集的代价函数很大,随着样本的增加,训练集的代价函数逐渐增大,交叉验证集的代价函数逐渐减小。绘制的曲线如下图所示: 

1. 如何用学习曲线识别欠拟合: 

假设我们的模型处于欠拟合的情况下,拟合曲线如下图所示: 

我们可以看出,无论我们怎样增加样本数据,误差都不会有很大改观。同时在欠拟合的情况下,会出现随着样本的增加,训练集代价函数和交叉验证集代价函数都很大的情况,在这种情况下,就没有必要花费时间在收集数据上了,同时这也是一种判断模型是过拟合还是欠拟合的方法。 

2. 如何使用学习曲线识别过拟合: 

假设我们有一个非常高次的多项式模型(比如最高次项达到100次),并且正则化非常小时,从下图可以看出,当交叉验证集误差远大于训练集误差时,往训练集增加更多数据可以提高模型的效果。 

对于过拟合现象时,会出现训练集代价函数一直都很小(虽然是增加的趋势),但是验证集的损失函数会很大(虽然是减小的趋势),同时训练集代价函数和验证集代价函数相差会很大,可以使用这种方法来判断该模型处于过拟合阶段。

对于神经网络我们在讨论一下过拟合和欠拟合现象:  

使用较小的神经网络,类似于参数较少的情况,容易导致高偏差和欠拟合,但是计算代价小;使用较大的神经网络,类似于参数较多的情况,容易导致高方差和过拟合,虽然计算代价比较大,但是可以通过正则化手段来调整而更加适应数据。 

对于 神经网络的模型选择 :我们一般选择较大的神经网络并采用正则化处理,而不会选择较小的神经网络。 

对于 神经网络隐藏层的层数选择 ,一般我们从一层开始逐渐增加层数,为了更好的选择出最佳的层数,可以针对不同隐藏层层数的神经网络进行训练,然后选择交叉验证集代价函数最小的神经网络。

⑸ 卷积神经网络(CNN)基础

在七月初七情人节,牛郎织女相见的一天,我终于学习了CNN(来自CS231n),感觉感触良多,所以赶快记下来,别忘了,最后祝大家情人节快乐5555555.正题开始!

CNN一共有卷积层(CONV)、ReLU层(ReLU)、池化层(Pooling)、全连接层(FC(Full Connection))下面是各个层的详细解释。

卷积,尤其是图像的卷积,需要一个滤波器,用滤波器对整个图像进行遍历,我们假设有一个32*32*3的原始图像A,滤波器的尺寸为5*5*3,用w表示,滤波器中的数据就是CNN的参数的一部分,那么在使用滤波器w对A进行滤波的话,可以用下面的式子表示:

其中x为原始图像的5*5*3的一部分,b是偏置项置为1。在对A进行滤波之后,产生的是一个28*28*1的数据。那么假设我们存在6个滤波器,这六个滤波器之间彼此是独立的,也就是他们内部的数据是不同的且没有相关性的。可以理解为一个滤波器查找整幅图像的垂直边缘,一个查找水平边缘,一个查找红色,一个查找黑色这样。那么我就可以产生6个28*28*1的数据,将它们组合到一起就可以产生28*28*6的数据,这就是卷积层主要做的工作。

CNN可以看作一系列的卷积层和ReLU层对原始数据结构进行处理的神经网络,处理的过程可以用下面这幅图表示

特别要注意的是滤波器的深度一定要与上一层传来的数据的深度相同,就像上图的第二个卷积层在处理传来的28*28*6的数据时要使用5*5*6的滤波器.

滤波器在图像上不断移动对图像滤波,自然存在步长的问题,在上面我们举的例子都是步长为1的情况,如果步长为3的话,32*32*3的图像经过5*5*3的滤波器卷积得到的大小是(32-5)/3+1=10, 注:步长不能为2因为(32-5)/2+1=14.5是小数。

所以当图像大小是N,滤波器尺寸为F时,步长S,那么卷积后大小为(N-F)/S+1

我们从上面的图中可以看到图像的长和宽在逐渐的减小,在经过超过5层之后极可能只剩下1*1的空间尺度,这样是十分不好的,而且也不利于我们接下来的计算,所以我们想让卷积层处理完之后图像在空间尺度上大小不变,所以我们引入了pad the border的操作。pad其实就是在图像周围补0,扩大图像的尺寸,使得卷积后图像大小不变。在CNN中,主要存在4个超参数,滤波器个数K,滤波器大小F,pad大小P和步长S,其中P是整数,当P=1时,对原始数据的操作如图所示:

那么在pad操作后卷积后的图像大小为:(N-F+2*P)/S+1
而要想让卷积层处理后图像空间尺度不变,P的值可以设为P=(F-1)/2

卷积层输入W 1 *H 1 *D 1 大小的数据,输出W 2 *H 2 *D 2 的数据,此时的卷积层共有4个超参数:
K:滤波器个数
P:pad属性值
S:滤波器每次移动的步长
F:滤波器尺寸
此时输出的大小可以用输入和超参计算得到:
W 2 =(W 1 -F+2P)/S+1
H 2 =(H 1 -F+2P)/S+1
D 2 =D 1

1*1的滤波器也是有意义的,它在深度方向做卷积,例如1*1*64的滤波器对56*56*64的数据卷积得到56*56的数据

F通常是奇数,这样可以综合考虑上下左右四个方向的数据。

卷积层从神经元的角度看待可以有两个性质: 参数共享和局域连接 。对待一个滤波器,例如5*5*3的一个滤波器,对32*32*3的数据卷积得到28*28的数据,可以看作存在28*28个神经元,每个对原图像5*5*3的区域进行计算,这28*28个神经元由于使用同一个滤波器,所以参数相同,我们称这一特性为 参数共享

针对不同的滤波器,我们可以看到他们会看到同一区域的图像,相当于在深度方向存在多个神经元,他们看着相同区域叫做 局域连接

参数共享减少了参数的数量,防止了过拟合
局域连接为查找不同特征更丰富的表现图像提供了可能。
卷积就像是对原图像的另一种表达。

激活函数,对于每一个维度经过ReLU函数输出即可。不改变数据的空间尺度。

通过pad操作,输出图像在控件上并没有变化,但是深度发生了变化,越来越庞大的数据给计算带来了困难,也出现了冗余的特征,所以需要进行池化操作,池化不改变深度,只改变长宽,主要有最大值和均值两种方法,一般的池化滤波器大小F为2步长为2,对于最大值池化可以用下面的图像清晰的表示:

卷积层输入W 1 *H 1 *D 1 大小的数据,输出W 2 *H 2 *D 2 的数据,此时的卷积层共有2个超参数:
S:滤波器每次移动的步长
F:滤波器尺寸
此时输出的大小可以用输入和超参计算得到:
W 2 =(W 1 -F)/S+1
H 2 =(H 1 -F)/S+1
D 2 =D 1

将最后一层(CONV、ReLU或Pool)处理后的数据输入全连接层,对于W 2 *H 2 *D 2 数据,我们将其展成1*1*W 2 *H 2 *D 2 大小的数据,输入层共有W 2 *H 2 *D 2 个神经元,最后根据问题确定输出层的规模,输出层可以用softmax表示。也就是说,全连接层就是一个常见的BP神经网络。而这个网络也是参数最多的部分,是接下来想要去掉的部分。完整的神经网络可以用下面的图表示:

[(CONV-ReLU)*N-POOL?]*M-(FC-RELU)*K,SoftMax

1.更小的滤波器与更深的网络
2.只有CONV层而去掉池化与全链接

最早的CNN,用于识别邮编,结构为:
CONV-POOL-CONV-POOL-CONV-FC
滤波器大小5*5,步长为1,池化层2*2,步长为2

2012年由于GPU技术所限,原始AlexNet为两个GPU分开计算,这里介绍合起来的结构。

输入图像为227*227*3

1.首次使用ReLU
2.使用Norm layers,现在已经抛弃,因为效果不大
3.数据经过预处理(例如大小变化,颜色变化等)
4.失活比率0.5
5.batch size 128
6.SGD Momentum 参数0.9(SGD和Momentum见我的其他文章)
7.学习速率 0.01,准确率不在提升时减少10倍,1-2次后达到收敛
8.L2权重减少0.0005
9.错误率15.4%

改进自AlexNet,主要改变:
1.CONV1的滤波器从11*11步长S=4改为7*7步长为2.
2.CONV3,4,5滤波器数量有384,384,256改为512,1024,512(滤波器数量为2的n次幂有利于计算机计算可以提高效率)
错误率:14.8%后继续改进至11.2%

当前最好的最易用的CNN网络,所有卷积层滤波器的大小均为3*3,步长为1,pad=1,池化层为2*2的最大值池化,S=2。

主要参数来自全连接层,这也是想要去掉FC的原因。

具有高度的统一性和线性的组合,易于理解,十分方便有VGG-16,VGG-19等多种结构。
错误率7.3%

完全移除FC层,参数只有500万,使用Inception模块(不太理解,有时间继续看)
准确率6.67%

准确率3.6%
拥有极深的网络结构,且越深准确率越高。是传统CNN不具备的特点,传统CNN并非越深越准确。需要训练时间较长但是快于VGG

1.每个卷积层使用Batch Normalization
2.Xavier/2初始化
3.SGD+Momentum(0.9)
4.Learning rate:0.1,准确率不变减小10倍(因为Batch Normalization所以比AlexNet大)
5.mini-batch size 256
6.Weight decay of 0.00001
7.不适用失活(因为Batch Normalization)

具体的梯度过程学完ResNet再说吧。

阅读全文

与卷积神经网络算法如何解决过拟合相关的资料

热点内容
网络通信安全密码口令 浏览:584
同一网络两个手机直播 浏览:433
移动网络的投屏慢 浏览:940
电脑网络设备状态异常 浏览:309
秋明网络游戏有哪些 浏览:92
电信联通移动哪个网络号 浏览:502
wifi网络拒绝存储 浏览:147
无线网络有感叹号能上网 浏览:257
什么是软文网络营销 浏览:777
联想bios网络唤醒设置 浏览:894
网络电视用哪个品牌好 浏览:177
河南干部网络学院学员有多少 浏览:502
苹果更换网络会让输入id密码 浏览:559
计算机网络计算题习题 浏览:803
e信网络断开后重新连接 浏览:194
游戏开发网络连接 浏览:937
手机网络机顶盒怎么用转换线 浏览:467
苹果手机添加隐藏wifi网络 浏览:923
微信网络推广有哪些特点 浏览:793
打电话时手机提醒未连接移动网络 浏览:610

友情链接