ImageNet Classification with Deep ConvolutionalNeural Networks(AlexNet总结大全附代码)

本文深入探讨了AlexNet——深度学习领域的里程碑之作,详述了论文内容、网络架构、ReLU激活函数、Dropout正则化以及训练策略。通过使用ReLU和数据增强技术,AlexNet显著提高了模型性能,降低了过拟合风险,推动了深度学习的发展。文章还介绍了在TensorFlow中实现ReLU和Dropout的相关API。
摘要由CSDN通过智能技术生成


作者:Alex Krizhevsky
发表时间:2015
论文地址[ https://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf]

一. 论文内容(已翻译)

1. Introduction

       ~~~~~~       目前的对象识别方法是机器学习方法的主要用途。 为了提高性能,我们可以收集更大的数据集,学习更强大的模型,并使用更好的技术来防止过度拟合。 直到最近,标记图像的数据集相对较小 —— 大约数万张图像。 使用此大小的数据集可以很好地解决简单的识别任务,特别是如果它们使用标签保留变换进行扩充。 例如,MNIST数字识别任务的当前最佳错误率(<0.3%)接近人类表现。但是在实际设置中的对象表现出相当大的可变性,因此要学会识别它们,有必要使用更大的 训练集。 事实上,小图像数据集的缺点已被广泛认可,但最近才有可能收集具有数百万图像的标记数据集。 新的更大的数据集包括LabelMe 和ImageNet,后者由数十万个完全分割的图像组成,ImageNet 包含超过22,000个标记的高分辨率图像,超过22,000个类别。
       ~~~~~~       要了解数百万图像中的数千个对象,我们需要一个具有大量学习能力的模型。 然而,对象识别任务的巨大复杂性意味着即使是像ImageNet这样大的数据集也无法解决这个问题,因此我们的模型需要有许多先验知识来弥补我们没有的所有数据。 卷积神经网络(CNN)构成了一类这样的模型。 它们的容量可以通过改变它们的深度和宽度来控制,并且它们也对图像的性质(即统计的平稳性和像素依赖性的位置)做出强有力且大多数正确的假设。因此,与具有相似性的标准前馈神经网络相比大小的层,CNN具有更少的连接和参数,因此它们更容易训练,而它们的理论上最佳性能可能仅略微恶化。
       ~~~~~~       本文的具体贡献如下:我们迄今为止在ILSVRC-2010和ILSVRC-2012竞赛中使用的ImageNet子集中训练了最大的卷积神经网络之一,并取得了迄今为止在这些数据集上的最佳结果。 我们编写了一个高度优化的2D卷积,GPU实现以及训练卷积神经网络中固有的所有其他操作,我们公开提供这些操作。 我们的网络包含许多新的和不寻常的功能,可以改善其性能并缩短其培训时间,详见第3节。我们的网络规模过大,即使有120万个标记的培训示例,我们也使用了几个防止过度拟合的有效技术,见第4节。我们的最终网络包含五个卷积层和三个完全连接层,这个深度似乎很重要:我们发现去除任何卷积层(每个卷层不超过1个) 模型参数的百分比)导致性能较差。
       ~~~~~~       最后,网络的大小主要受到当前gpu上可用内存的大小和我们愿意忍受的训练时间的大小的限制。我们的网络需要5到6天的时间来训练两个GTX 580 3GB gpu。我们所有的实验都表明,只要等待更快的gpu和更大的数据集可用,我们的结果就可以得到改善。

2 The Dataset

       ~~~~~~       ImageNet是一个包含超过1500万张高分辨率图像的数据集,属于大约22,000个类别。这些图片是从网上收集的,并由人进行标记。从2010年开始,作为Pascal视觉对象挑战赛的一部分,每年都会举办一场名为ImageNet大型视觉识别挑战赛(ILSVRC)的比赛。ILSVRC使用ImageNet的一个子集,在1000个类别中每个类别大约有1000幅图像。总共大约有120万张训练图像、50,000张验证图像和150,000张测试图像。

3 The Architecture

       ~~~~~~       图2总结了我们的网络架构。它包含八个学习层、五个卷积层和三个全连接层。下面,我们将描述我们的网络体系结构的一些新奇或不寻常的特性。第3.1-3.4节根据我们对其重要性的估计进行排序,其中最重要的部分。

3.1 ReLU Nonlinearity

       ~~~~~~       将神经元输出f建模为其输入x的函数的标准方法是 f ( x ) = t a n h ( x ) f(x)= tanh(x) fx=tanhx f ( x ) = 1 ( 1 + e − x ) − 1 f(x)=\frac{1}{(1 + e^{-x})^{-1}} fx=1+ex11。 就具有梯度下降的训练时间而言,这些饱和非线性比非饱和非线性 f ( x ) = m a x ( 0 , x ) f(x)= max(0,x) fx=max0x慢得多。 在Nair和Hinton 之后,我们将具有这种非线性的神经元称为整流线性单位(ReLUs)。 具有ReLU的深度卷积神经网络比具有 t a n h tanh tanh单位的等效物快几倍。 图1展示了这一点,图1显示了针对特定四层卷积网络在CIFAR-10数据集上达到25%训练误差所需的迭代次数。 该图表明,如果我们使用传统的饱和神经元模型,我们就无法用这种大型神经网络进行实验。
在这里插入图片描述
       ~~~~~~       我们不是第一个考虑CNN中传统神经元模型替代品的人。 例如,Jarrettet al,声称非线性 f ( x ) = ∣ t a n h ( x ) ∣ f(x)= | tanh(x)| fx=tanhx 特别适用于它们的对比度正则化类型,然后是Caltech-101数据集上的局部平​​均汇集。 但是,在此数据集上,主要关注的是防止过度拟合,因此他们观察到的效果与我们在使用ReLU时报告的训练集的加速能力不同。 更快的学习对在大型数据集上训练的大型模型的性能有很大影响。

3.2 Training on Multiple GPUs

       ~~~~~~       单个GTX 580 GPU只有3GB内存,这限制了可以在其上训练的网络的最大尺寸。 事实证明,120万个训练样例足以训练太大而无法放在一个GPU上的网络。 因此,我们将网络分布在两个GPU上。 当前的GPU特别适合跨GPU并行化,因为它们能够直接读取和写入彼此的内存,而无需通过主机内存。 我们采用的并行化方案基本上将一半内核(或神经元)放在每个GPU上,还有一个额外的技巧:GPU仅在某些层中进行通信。 这意味着,例如,第3层的内核从第2层的所有内核映射中获取输入。然而,第4层的内核只从位于同一GPU的第3层的内核映射中获取输入。对于交叉验证来说,选择连接模式是一个问题,但这允许我们精确地调整通信量,直到它是计算量的可接受部分。

3.3 Local Response Normalization

       ~~~~~~       ReLUs有一个理想的特性,即不需要对输入进行标准化以防止其饱和。如果有很少的训练样本对ReLU产生积极的输入,学习就会发生在那个神经元上。但是,我们仍然发现下面的局部归一化方案有助于泛化。用 a x , y i {a^{i}_{x,y}} ax,yi 表示在(x,y)位置上应用核 i i i 计算神经元的活动,再应用ReLU非线性,得到响应归一化的 b x , y i {b^{i}_{x,y}} bx,yi活动由表达式:
$ b x , y i = a x , y i ( k + α ∑ j = m a x ( 0 , i − n / 2 ) m i n ( N − 1 , i + n / 2 ) ( a x , y j ) 2 ) β {b^{i}_{x,y}} = \frac{{a^{i}_{x,y}}}{(k + \alpha \sum_{j=max(0, i-n/2)}^{min(N-1, i+n /2)} ({a_{x,y}^{j}})^2)^{\beta}} bx,yi=(k+αj=max(0,in/2)min(N1,i+n/2)(ax,yj)2)βax,yi
在相同的空间位置上运行n个相邻的内核映射,n是该层中内核的总数。当然,内核映射的顺序是任意的,并在培训开始之前确定。这种反应归一化实现了一种形式的横向抑制,其灵感来自于在真实神经元中发现的类型,在使用不同内核计算的神经元输出之间产生对大型活动的竞争。常数 k,n,α 和 β 是超参数,其值使用验证集确定; 我们使用 k = 2 , n = 5 , α = 10 − 4 , β = 0.75 k = 2,n = 5,α = 10-4,β = 0.75 k=2n=5α=104β=0.75。我们在某些层中应用ReLU非线性后应用了这种归一化(参见第3.5节)。
       ~~~~~~       这个方案与Jarrett 的局部对比度归一化方案有一些相似之处,但是我们的方案更准确地称为亮度归一化,因为我们没有减去一个活动的主题。响应规范化将前1名和前5名的错误率分别降低1.4%和1.2%。我们还在CIFAR-10数据集上验证了该方案的有效性:四层CNN在不进行归一化的情况下测试错误率为13%,在进行归一化的情况下测试错误率为11%

3.4 Overlapping Pooling

       ~~~~~~       CNNs中的汇聚层总结了同一核映射中相邻神经元群的输出。传统上,相邻池单元汇总的邻域不重叠。更精确地说,池化层可以被认为是由间隔为 s s s像素的池化单元网格组成,每个网格汇总一个以池化单元位置为中心的大小为 z ∗ z z*z zz 的邻域。如果我们设置 s = z s = z s=z,我们获得CNN中常用的传统本地池化。 如果我们设置 s &lt; z s &lt; z s<z,我们获得重叠池化。 这是我们在整个网络中使用的, s = 2 s = 2 s=2 z = 3 z = 3 z=3 与非重叠方案 s = 2 , z = 2 s = 2, z = 2 s=2,z=2 相比,该方案将 top-1 和 top-5 错误率分别降低了 0.4% 和 0.3%,产生等效尺寸的输出。 我们通常在训练期间观察到具有重叠池化的模型发现过度拟合稍微困难一些。

3.5 Overall Architecture

       ~~~~~~       现在我们准备描述CNN的总体架构。如图2所示,网络包含八层权重;前五个是卷积的,其余三个是完全连接的,最后一个全连接层的输出被提供给一个1000个softmax,它产生一个超过1000个类标签的分布。我们的网络将多项式逻辑回归目标最大化,这等价于在预测分布下,将正确标签的log-概率的训练样本均值最大化。在这里插入图片描述
       ~~~~~~       第二,第四和第五卷积层的内核仅连接到位于同一GPU上的前一层中的那些内核映射(参见图2)。 第三卷积层的内核连接到第二层中的所有内核映射。 完全连接的层中的神经元连接到前一层中的所有神经元。 响应标准化层遵循第一和第二卷积层。 3.4节中描述的最大池化层遵循响应归一化层和第五卷积层。 ReLU非线性应用于每个卷积和完全连接层的输出。
       ~~~~~~       第一个卷积层过滤了 224 ∗ 224 ∗ 3 224*224*3 2242243 输入图像,用96个大小为 11 ∗ 11 ∗ 3 11*11*3 11113,步长为4个像素的卷积核(这是核映射中相邻神经元接受域中心之间的距离)。第二个卷积层用第一个卷积层的输出(响应归一化和池化)作为输入,并使用256个大小为 5 ∗ 5 ∗ 48 5*5*48 5548 的内核对其进行过滤。第三、第四和第五卷积层相互连接,不需要任何池化或标准化层。第三个卷积层有384个大小为 3 ∗ 3 ∗ 256 3*3*256 33256 的内核连接到第二个卷积层的输出(归一化、池化)。第四个卷积层有384个大小为 3 ∗ 3 ∗ 192 3*3 *192 33192 的内核,第五个卷积层有256个大小为 3 ∗ 3 ∗ 192 3*3*192 33192 的内核。全连接层各有4096个神经元。

4 Reducing Overfitting

       ~~~~~~       我们的神经网络结构有6000万个参数。尽管ILSVRC的1000个类使得每个训练示例对从图像到标签的映射施加10位的约束,但是如果不进行大量的过拟合,学习这么多参数是不够的。下面,我们将描述两种主要的方法来对抗过度拟合。

4.1 Data Augmentation

       ~~~~~~       减少图像数据过拟合最简单、最常用的方法是使用保留标签的变换来人为地扩大数据集。我们使用了两种不同的数据增强形式,这两种方法都允许从原始图像生成转换后的图像,并且只需要很少的计算,因此转换后的图像不需要存储在磁盘上。在我们的实现中,转换后的图像是在CPU上用Python代码生成的,而GPU正在对前一批图像进行训练。因此,这些数据增强方案实际上是无需计算的。
       ~~~~~~       第一种形式的数据增强包括生成图像平移和水平反射。 我们通过从 256×256 图像中提取随机 224×224 patches(及其水平反射),并在这些提取的patches上训练我们的网络来实现这一点。这使我们的训练集的大小增加了 2048倍, 当然,这些例子是高度相互依赖的。如果没有这种方案,我们的网络就会遭受严重的过度拟合,这将迫使我们使用更小的网络。 在测试时,网络通过提取五个 224×224 patches 以及它们的水平反射进行预测,并对网络的softmax层进行的预测求平均值十个patches。
        ~~~~~~~        第二种形式的数据增强包括改变训练图像中RGB通道的强度。具体地说,我们在整个ImageNet训练集中对RGB像素值集进行PCA。对每一幅训练图像,我们将找到的主成分的倍数相加,其大小与对应的特征值成正比,乘以从均值为零、标准差为0.1的高斯分布中抽取的随机变量。因此,对于每个RGB图像像素 I x y = [ I x y R , I x y G , I x y B ] T I_{xy} = {[ I^{R}_{xy},I^{G}_{xy},I^{B}_{xy} ]}^{T} Ixy=[IxyR,IxyG,IxyB]T,我们添加以下数量:
[ P 1 , P 2 , P 3 ] [ α 1 λ 1 , α 2 λ 2 , α 3 λ 3 ] T {[P1, P2, P3][\alpha1\lambda1, \alpha2\lambda2, \alpha3\lambda3]^{T}} [P1,P2,P3][α1λ1,α2λ2,α3λ3]T
其中, P i Pi Pi λ i λi λi 分别是RGB像素值的 3×3 协方差矩阵的第 i 个特征向量和特征值,αi 是上述随机变量。 对于特定训练图像的所有像素,每个 αi 仅被初始化一次,直到该图像再次被用于训练,此时它被重新初始化。 该方案近似地捕获自然图像的重要特性,即对象对于照明的强度和颜色的变化是不变的。 该方案将前1个错误率降低了1%以上。

4.2 Dropout

       ~~~~~~       结合许多不同模型的预测是减少测试错误的一种非常成功的方法,但对于已经需要几天时间训练的大型神经网络来说,这种方法似乎过于昂贵。然而,有一个非常有效的模型组合版本,在培训期间只需要花费大约两倍的成本。最近引入的一种技术叫做 dropout,它将每个隐藏神经元的输出设置为0,输出概率为0.5。以这种方式“退出”的神经元对前向传递没有贡献并且不参与反向传播。 因此,每次输入时,神经网络都会采样不同的架构,但所有这些架构都会共享权重。 该技术减少了神经元的复杂共同适应,因为神经元不能依赖于特定其他神经元的存在。 因此,它被迫学习更强大的特征,这些特征与其他神经元的许多不同随机子集一起使用是有用的。在测试时,我们使用所有神经元但是将它们的输出乘以0.5,这是采用由指数多个丢失网络产生的预测分布的几何平均值的合理近似。我们在前两个完全连接的层中使用了丢失(如图2所示)。在没有Dropout的情况下,我们的网络表现出明显的过度拟合。Dropout大约是收敛所需迭代次数的两倍。

5 Details of learning

       ~~~~~~       我们使用随机梯度下降训练我们的模型,批量大小为128个例子,动量为0.9,重量衰减为0.0005。我们发现这一小部分的重量衰减对模型的学习很重要。换句话说,这里的重量衰减不仅仅是一个正则化器:它减少了模型s的训练误差。权值w的更新规则是:
在这里插入图片描述在这里插入图片描述
将每一层的权值初始化为零均值高斯分布,标准差为0.01。我们在第二层、第四层、第五层卷积层以及全连通隐层中初始化神经元偏差,初始值为常数1。这种初始化通过向ReLUs提供积极的输入来加速学习的早期阶段。我们用常数0初始化剩余层中的神经元偏差。我们对所有层次使用了相同的学习速度,并在整个培训过程中手动调整。我们采用的启发式方法是将学习速率除以10,当验证错误率停止随当前学习速率改进时。初始化学习率为0.01,终止前降低3次。我们在两台NVIDIA GTX 580 3GB gpu上花了5到6天的时间,通过120万幅图像的训练集,对网络进行了大约90次周期的训练。

二. ReLu

1. 表达式

f ( x ) = m a x ( x , 0 ) f(x) = max(x, 0) f(x)=max(x,0)

2. 在Tensorflow中的API

tf.nn.relu(
	features,
	name = None
)

例子:

# 引入tensorflow
import tensorflow as tf
# 定义恒定值的tensor a
a = tf.constant([-1.0, 2.0])
# 创建一个会话
with tf.Session() as sess:
    # 进行relu操作
    b = tf.nn.relu(a, name='relu')
    # 进行输出结果
    print(sess.run(b))

结果

[0. 2.]

3. ReLu的优点

  1. 可以使网络训练的更快
    相比较于tanh,sigmod而言,relu的导数更好求,反向串比偶会涉及到激活函数的求导,tanh,sigmod包含指数且表达式复杂,他们的函数的导数求取慢一点。
  2. 增加网络的非线性
    relu为非线性函数,加入到神经网络中可以使网络拟合非线性的映射,因此增加了网络的非线性。
  3. 防止梯度消失(弥散)
    当数值过大或者过小时,sigmoid,tanh导数接近于0,会导致反向传播时梯度消失的问题,relu为非饱和激活函数不存在此类问题。
  4. 是网络具有稀疏性
    relu可以使一些神经元输出为0,因此可以增加网络的稀疏性。

三. Dropout层

1. 作用

随机将一定比例的神经元置为0;对于一个有n个节点的神经网络,有了dropout后,就可以看作是2n个模型的集合了;相当于机器学习中的模型ensemble.

2. 在Tensorflow中的API

tf.nn.dropout
tf.nn.dropout(
	x,
	keep_prob = None,   // 每个元素被保留的概率
	noise_shape = None,
	seed = None,
	name = None,
)

四. 网络结构

在这里插入图片描述
conv1 relu1 norm1 --> pool1 --> conv2 relu2 norm2 --> pool2 --> conv3 relu3 --> conv4 relu4 --> conv5 relu5 --> pool5 --> fc6 relu6 dropout6 --> fc7 relu7 dropout7 --> fc8(logits) --> softmax

五. 训练数据

  1. 随机地从256256的原始图像中截取224224大小的区域(以及水平翻转及镜像),相当于增加了2×(256-224)^ 2 = 2048倍的数据量。
  2. 对图像的RGB数据进行PCA处理,并对主成分做一个标准差为0.1的高斯扰动,增加一些噪声,这个Trick可以让错误率再下降1%。
  3. 进行预测时,则是取图像的四个角加中间共五个位置,并进行左右翻转,对他们进行预测时并对10次结果求均值。

六. 超参数设置

  • 批量大小:batchsize = 128
  • 权重衰减:weight decay = 0.0005
  • 学习率:learning rate = 0.01
  • 衰减率:0.01
  • 轮数:epoches = 90
  • 卷积核初始化的方式:均值为0,方差为1的高斯分布
  • 偏置项初始化方式:2,4,5卷积层及全连接层初始化为1,剩余层初始化为0

七. 网络意义

  1. 成功使用ReLu作为CNN的激活函数,并验证其效果在较深的网路超过了Sigmoid,成功解决了Sigmoid在网络较深时梯度弥散问题。
  2. 训练时使用Dropout随机忽略一部分神经元,以避免模型过拟合。Dropout虽有单独的论文论述,但是AlexNet将其实用化,通过实践证实了它的效果。在AlexNet中主要是最后几个全连接层使用了Dropout。
  3. 在CNN中使用重叠的最大池化。此前CNN中普遍使用平均池化,AlexNet全部使用最大池化,避免平均池化的模糊化的效果。并且让步长比池化核的尺寸小,这样池化层的输出之间会有重叠和覆盖,提升了特征的丰富性。
  4. 提出LRN层,对局部神经元的活动创建竞争机制,使得其中相应比较大的值变得相对更大,并抑制其他反馈较小的神经元,增强模型的泛化能力(VGG中证明这个作用不大)。
  5. 使用CUDA加速深度卷积网络的训练,利用GPU强大的并行计算能力,处理神经网络训练时大量的矩阵运算。AlexNet使用两块GTX 580 GPU进行训练,同时AlexNet的设计让GPU之间的通信只在网络的某些层进行,控制了通信的性能损耗。
  6. 数据增强(同上)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值