课程总结:神经网络与深度学习(二)

一、LeNet-5网络

图1 LeNet-5网络结构图

LeNet-5虽然是早期提出的一个小网络,但是却包含了深度学习卷积神经网络的基本模块:卷积层、池化层和全连接层。如图1所示,LeNet-5一共包含7层(输入层不作为网络结构),分别由2个卷积层、2个池化层和3个连接层组成,网络的参数配置如表1所示,其中下采样层和全连接层的核尺寸分别代表采样范围和连接矩阵的尺寸。

接下来,分别详解各层参数

1、卷积层C_{1}


手写数字数据集是灰度图像,输入为32 × 32 × 1的图像,卷积核大小为5 × 5,卷积核数量为6,步长为1,零填充。最终得到的C_{1}的feature maps大小为(32 − 5 + 1 = 28)。可训练参数:( 5 × 5 + 1 ) × 6 ,其中有6个滤波器,每个滤波器5 × 5个units参数和一个bias参数,总共需要学习156个参数,这些参数是权值共享的。

2、下采样层S_{2}

卷积层C_{1}之后接着就是池化运算,池化核大小为2 × 2,LeNet-5池化运算的采样方式为4个输入相加,乘以一个可训练参数,再加上一个可训练偏置,结果通过sigmoid,所以下采样的参数个数是( 1 + 1 ) × 6而不是零。

3、卷积层C_{3}

在LeNet-5中,C_{3}中的可训练参数并未直接连接S_{2}中所有的特征图(Feature Map),而是采用如图2所示的采样特征方式进行连接(稀疏连接)。具体地,C_{3}的前6个feature map(对应图2第一个红框的前6列)与S_{2}层相连的3个feature map相连接(图2第一个红框),后面6个feature map与S_{2}层相连的4个feature map相连接(图2第二个红框),后面3个feature map与S_{2}层部分不相连的4个feature map相连接,最后一个与S_{2}层的所有feature map相连。卷积核大小依然为5 × 5 ,所以总共有6 × ( 3 × 5 × 5 + 1 ) + 6 × ( 4 × 5 × 5 + 1 ) + 3 × ( 4 × 5 × 5 + 1 ) + 1 × ( 6 × 5 × 5 + 1 ) = 1516 个参数。在原论文中解释了使用这种采样方式原因包含两点:限制了连接数不至于过大(当年的计算能力比较弱);强制限定不同特征图的组合可以使映射得到的特征图学习到不同的特征模式。

图2 S_{2}C_{3}之间的特征图稀疏连接

4、下采样层S_{4}
 

与下采样层S_{2}类似,采用大小为2 × 2,步距为2的池化核对输入feature maps下采样,输出feature maps大小为5 × 5

5、卷积层C_{5}


​与卷积层C_{3}不同,卷积层C_{5}的输入为S_{4}的全部feature maps,由于S_{4}层的16个图的大小为5 × 5,与卷积核的大小相同,所以卷积后形成的图的大小为1x1。

6、全连接层F_{6}


F_{6}和Output层在图1中显示为全连接层,原论文中解释这里实际采用的是卷积操作,只是刚好在5 × 5卷积后尺寸被压缩为1 × 1,输出结果看起来和全连接很相似。

二、AlexNet

1、AlexNet 模型的特点


AlexNet 之所以能够成功,跟这个模型设计的特点有关,主要有:

  • 使用了非线性激活函数:ReLU
  • 防止过拟合的方法:Dropout,数据扩充(Data augmentation)
  • 其他:多 GPU 实现,LRN 归一化层的使用

1、使用 ReLU 激活函数


传统的神经网络普遍使用 Sigmoid 或者 tanh 等非线性函数作为激励函数,然而它们容易出现梯度弥散或梯度饱和的情况。以 Sigmoid 函数为例,当输入的值非常大或者非常小的时候,这些神经元的梯度接近于 0(梯度饱和现象),如果输入的初始值很大的话,梯度在反向传播时因为需要乘上一个 Sigmoid 导数,会造成梯度越来越小,导致网络变的很难学习。(详见本公博客的文章:深度学习中常用的激励函数)。

在 AlexNet 中,使用了 ReLU (Rectified Linear Units)激励函数,该函数的公式为:f (x)=max (0,x),当输入信号 < 0 时,输出都是 0,当输入信号 > 0 时,输出等于输入。

使用 ReLU 替代 Sigmoid/tanh,由于 ReLU 是线性的,且导数始终为 1,计算量大大减少,收敛速度会比 Sigmoid/tanh 快很多。

2、数据扩充(Data augmentation)


有一种观点认为神经网络是靠数据喂出来的,如果能够增加训练数据,提供海量数据进行训练,则能够有效提升算法的准确率,因为这样可以避免过拟合,从而可以进一步增大、加深网络结构。而当训练数据有限时,可以通过一些变换从已有的训练数据集中生成一些新的数据,以快速地扩充训练数据。
其中,最简单、通用的图像数据变形的方式:水平翻转图像,从原始图像中随机裁剪、平移变换,颜色、光照变换。

AlexNet 在训练时,在数据扩充(data augmentation)这样处理:
(1)随机裁剪,对 256×256 的图片进行随机裁剪到 224×224,然后进行水平翻转,相当于将样本数量增加了((256-224)^2)×2=2048 倍;
(2)测试的时候,对左上、右上、左下、右下、中间分别做了 5 次裁剪,然后翻转,共 10 个裁剪,之后对结果求平均。作者说,如果不做随机裁剪,大网络基本上都过拟合;
(3)对 RGB 空间做 PCA(主成分分析),然后对主成分做一个(0, 0.1)的高斯扰动,也就是对颜色、光照作变换,结果使错误率又下降了 1%。

3、重叠池化 (Overlapping Pooling)


一般的池化(Pooling)是不重叠的,池化区域的窗口大小与步长相同。在 AlexNet 中使用的池化(Pooling)却是可重叠的,也就是说,在池化的时候,每次移动的步长小于池化的窗口长度。AlexNet 池化的大小为 3×3 的正方形,每次池化移动步长为 2,这样就会出现重叠。重叠池化可以避免过拟合,这个策略贡献了 0.3% 的 Top-5 错误率。

4、局部归一化(Local Response Normalization,简称 LRN)


在神经生物学有一个概念叫做 “侧抑制”(lateral inhibitio),指的是被激活的神经元抑制相邻神经元。归一化(normalization)的目的是 “抑制”,局部归一化就是借鉴了 “侧抑制” 的思想来实现局部抑制,尤其当使用 ReLU 时这种 “侧抑制” 很管用,因为 ReLU 的响应结果是无界的(可以非常大),所以需要归一化。使用局部归一化的方案有助于增加泛化能力。
LRN 的公式如下,核心思想就是利用临近的数据做归一化,这个策略贡献了 1.2% 的 Top-5 错误率。

5、Dropout


引入 Dropout 主要是为了防止过拟合。在神经网络中 Dropout 通过修改神经网络本身结构来实现,对于某一层的神经元,通过定义的概率将神经元置为 0,这个神经元就不参与前向和后向传播,就如同在网络中被删除了一样,同时保持输入层与输出层神经元的个数不变,然后按照神经网络的学习方法进行参数更新。在下一次迭代中,又重新随机删除一些神经元(置为 0),直至训练结束。
Dropout 应该算是 AlexNet 中一个很大的创新,以至于 “神经网络之父” Hinton 在后来很长一段时间里的演讲中都拿 Dropout 说事。Dropout 也可以看成是一种模型组合,每次生成的网络结构都不一样,通过组合多个模型的方式能够有效地减少过拟合,Dropout 只需要两倍的训练时间即可实现模型组合(类似取平均)的效果,非常高效。

6、多 GPU 训练


AlexNet 当时使用了 GTX580 的 GPU 进行训练,由于单个 GTX 580 GPU 只有 3GB 内存,这限制了在其上训练的网络的最大规模,因此他们在每个 GPU 中放置一半核(或神经元),将网络分布在两个 GPU 上进行并行计算,大大加快了 AlexNet 的训练速度。

三、残差网络

1、残差结构

先说方法,残差结构通过引入跳跃连接的方式,将输入直接映射到输出,解决梯度爆炸与梯度消失的问题。

深度神经网络通常具有许多层,信息必须通过这些层逐步传递。在传统的神经网络中,每个层都会对输入进行一系列变换,这可能导致梯度逐渐变小,使得梯度消失问题更加严重。这意味着在反向传播过程中,更新较早层的权重会非常小,因此这些层几乎没有学习到任何有用的信息。这限制了神经网络的深度,因为较深的网络更容易受到梯度消失问题的影响。

ResNet引入了残差连接,允许信息在不同层之间直接跳跃传递。这样,网络可以学习将输入映射到残差(差异),而不是直接映射到目标输出。这种残差学习的方式使得在训练过程中更容易传递梯度,因为网络可以轻松地学习将输入信息添加到输出中,而不需要学习复杂的非线性变换。

通过引入残差连接,ResNet允许构建非常深的神经网络,而不会受到梯度消失问题的明显影响,因此它可以在图像分类、目标检测、语义分割等计算机视觉任务中取得更好的性能。这是ResNet在深度学习中的一个重要突破,促使了更深层次的神经网络的发展。

resnet网络最深的有158层,可见残差结构的强大

2、残差结构的实现

在前面的学习中,我们说使用深度学习框架可以快速简单的帮助我们完成算法的搭建,只要有算法的结构图,就能很快的完成算法的搭建。我们上边的两张图知识示意图,下买呢给两个最为简单残差链接,并使用torch完成。

四、Inception网络

1、Inception网络模块

Inception网络结构中其中一个模块是这样的:在同一层中,分别含有1*1、3*3、5*5卷积和池化层,在使用滤波器进行卷积操作与池化层进行池化操作时都会使用padding以保证输出都是同尺寸大小,经过这些操作后输出的结果也就是特征图Featuremap再全部整合在一起。该模块的特性就是在同一层中,分别通过使用上述不同尺寸的滤波器与进行池化操作收集到了上一层输入的不同特征。这样就增加了网络的宽度,用这些不同尺寸的滤波器和池化操作去提取上一层的不同特征。

2、Inception网络降低参数计算量

针对5*5卷积的这一层,不包含1*1的卷积模块时,参数量为5*5*256*64=409600个参数,连接数为(5*5*256+1)*64*n*n=409664*n*n个。而包含1*1的卷积模块时,参数量为1*1*256*32+5*5*32*64=59392个参数,连接数为((1*1*256+1)*32*n*n+(5*5*32+1)*64*n*n)=59488*n*n个。由此可见,包含1*1的卷积模块比不包含的参数数量和计算量要少很多。

Inception网络在增加了网络宽度,每一层都用不同的卷积池化去提取上一层特征图的特征,并且采用了在3*3和5*5卷积前,池化层后添加1*1卷积,可以有效避免了复杂的参数和计算量。这样Inception很好的缓和了因扩大网络宽度而造成的计算量过大和过拟合问题。

3、Inception网络减缓梯度消失现象

Inception网络框架中会有额外的两个softmadx预测层,这两个预测层分别是从网络框架中间部分引出的分支,用于反向传播更新梯度,这样就避免了因梯度消失导致浅层的网络参数无法更新。注意这两个分支只在训练的时候防止梯度消失会用到,真正做预测的时候需要删除。

五、VGG-16网络

1、不同模型的参数数量

单位:百万

NetworkA,A-LRNBCDE
参数数量133133134138144

VGG的参数数量非常大。

2、3x3卷积核的好处

  • 参数少: 一个3x3卷积核拥有9个权重参数,而一个5x5卷积核则需要25个权重参数,因此采用3x3卷积核可以大幅度减少网络的参数数量,从而减少过拟合的风险;
  • 提高非线性能力: 多个3x3卷积核串联起来可以形成一个感受野更大的卷积核,而且这个组合具有更强的非线性能力。在VGG中,多次使用3x3卷积核相当于采用了更大的卷积核,可以提高网络的特征提取能力;
  • 减少计算量: 一个3x3的卷积核可以通过步长为1的卷积操作,得到与一个5x5卷积核步长为2相同的感受野,但计算量更小(即2个3x3代替一个5x5);3个3x3代替一个7x7的卷积;因此,VGG网络采用多个3x3的卷积核,可以在不增加计算量的情况下增加感受野,提高网络的性能;

3、 关于学习率调度

学习率调度(learning rate scheduling)是优化神经网络模型时调整学习率的技术,它会随着训练的进行动态地调整学习率的大小。通过学习率调度技术,可以更好地控制模型的收敛速度和质量,避免过拟合等问题。

常用的学习率调度包括常数衰减、指数衰减、余弦衰减和学习率分段调整等。

optim.lr_scheduler.StepLR 是 PyTorch中提供的一个学习率调度器。这个调度器根据训练的迭代次数来更新学习率,当训练的迭代次数达到step_size的整数倍时,学习率会乘以gamma这个因子,即新学习率 = 旧学习率 * gamma。例如,如果设置了step_size=10和gamma=0.5,那么学习率会在第10、20、30、40...次迭代时变成原来的一半。

4、批归一化

nn.BatchNorm2d(256)是一个在PyTorch中用于卷积神经网络模型中的操作,它可以对输入的二维数据(如图片)的每个通道进行归一化处理。

Batch Normalization 通过对每批数据的均值和方差进行标准化,使得每层的输出都具有相同的均值和方差,从而加快训练速度,减少过拟合现象。nn.BatchNorm2d(256)中的256表示进行标准化的通道数,通常设置为输入数据的特征数或者输出数据的通道数。

在使用nn.BatchNorm2d(256)时,需要将其作为神经网络的一部分,将其添加进网络层中,位置是在卷积后、ReLU前,经过训练之后,每个卷积层的输出在经过BatchNorm层后都经过了归一化处理,从而使得神经网络的训练效果更加稳定。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值