白话超级详细解读(二)-----AlexNet

一、AlexNet简介

2012年,Alex Krizhevsky可以算作是LeNet的一个更深和更广的版本,可以用来学习更加复杂的对象。
Alex的要点

  • 1.用ReLU得到非线性,用ReLU非线性函数作为激活函数
  • 2.使用dropout的trick在训练期间有选择性的忽略隐藏层神经元,来减缓学习模型的过拟合
  • 3.使用重叠最大池进行池化操作,避免平均池的平均效果
  • 4.使用GPU可以减少训练时间,这比CPU处理快了10倍,所以可以被用于更大的数据集和图像上。

二、AlexNet细节介绍

2.1 局部响应归一化(LRN)

推荐阅读:https://blog.csdn.net/program_developer/article/details/79430119
在神经生物学上有一个"侧抑制"的概念,指的是被激活的神经元会抑制相邻神经元。归一化的目的就是"抑制",局部响应归一化就是借鉴侧抑制的思想来实现局部抑制。尤其是我们使用Relu的时候,这种抑制会很管用。

2.2 数据增强(Data Augmentation)

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

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

2.3 dropout

推荐阅读:https://blog.csdn.net/program_developer/article/details/80737724

2.3.1 dropout简介

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

2.3.2 dropout具体工作流程

假设我们要训练这样一个神经网络,如下图所示:
在这里插入图片描述
如上图所示,这是一个正常的神经网络
输入是x,输出是y,正常的流程是:我们首先把x通过网络进行前向传播,然后把误差反向传播以决定如何更新参数,让网络进行学习。使用Dropout之后,过程变成如下:

  • 1.首先随机(临时)删掉网络中一半的隐藏神经元,输入输出神经元保持不变,(下图虚线为部分临时被删除的神经元)
    在这里插入图片描述
  • 2.然后把输入x通过修改后的网络前向传播,然后把得到的损失结果通过修改的网络反向传播。一小批训练样本执行完这个过程后,在没有被删除的神经元上按照随机梯度下降法更新对应的参数(w,b)。
  • 然后重复执行这一过程:
    • 恢复被临时删掉的神经元(此时被删掉的神经元恢复原样,而没有被删掉的神经元已经有所更新)
    • 从隐藏层神经元中随机选择一个一半大小的子集临时删掉(备份被删掉的神经元的参数)
    • 对一小批训练样本,先前向传播然后反向传播损失,并根据随机梯度下降法更新参数(w,b)(没有被删掉的那一部分神经元得到更新,删掉的神经元保持被删除前的结果)
  • 不断重复这一过程。

2.3.2 dropout在神经网络中的使用

(1)在训练模型阶段
无可避免的,在训练网络的每个单元都要添加一道概率流程。
在这里插入图片描述
对应的公式变化如下:

  • 没有Dropout的网络计算公式:
    在这里插入图片描述
  • 采用Dropout的网络计算公式:
    在这里插入图片描述
    上面公式Bernoulli函数是为了生成概率r向量,也就是随机生成一个0、1的向量。
    代码层面实现让某个神经元以概率P停止工作,其实就是让他的激活函数值以概率P变为0.比如我们某一层的网络神经元的个数为1000个,其激活函数输出值为y1、y2、y3、…、y1000,我们将Dropout的比率置为0.5,那么这一层神经元经过Dropout之后,1000个神经元会有大约400个的值被置为0.

(2)在测试模型阶段
预测模型的时候,每一个神经单元的权重参数要乘以概率p。在这里插入图片描述
测试阶段Dropout公式:
在这里插入图片描述

2.4 重叠最大池化(Overlapping Pooling)

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

三、AlexNet 网络结构

3.1 网络结构全貌

AlexNet模型介绍如下:

  • 1.AlexNet共8层,包括5个卷积层和3个全连接层
  • 2.每一层都使用了Relu函数作为激活函数
  • 3.AlexNet有一个特殊的计算层-LRN层,开辟性的使用了LRN(局部相应归一化)层
    网络结构全貌
    在PyTorch的version包中是包含AlexNet的官方实现的,我们直接使用官方版本看下网络的大致结构:
import torchvision
model = torchvision.models.alexnet(pretrained = False)
print(model)

在这里插入图片描述

3.2 计算

这里详细描述了每一层的结构及输入输出的相关计算。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、参考文献

猜你喜欢

转载自blog.csdn.net/dongjinkun/article/details/109307416
今日推荐