当前位置:   article > 正文

【图像分类—AlexNet】ImageNet Classification with Deep Convolutional Neural Networks_alexnet:imagenet classification with deep convolut

alexnet:imagenet classification with deep convolutional neural networks

在这里插入图片描述

一、论文翻译

论文:ImageNet Classification with Deep Convolutional Neural Networks

在ImageNet LSVRC-2010 2012表现突出,top-1误差率37.5%,以及top-5误差率17.0%;网络有6000万个参数和650,000个神经元;网络结构五个卷积层,以及某些卷积层后的池化层,以及最后的三个全连接层;引入正则化方法dropout;引入ReLU修正线性单元。

摘要

我们训练了一个庞大的深层卷积神经网络,将ImageNet LSVRC-2010比赛中的120万张高分辨率图像分为1000个不同的类别。在测试数据上,我们取得了37.5%和17.0%的前1和前5的错误率,这比以前的先进水平要好得多。具有6000万个参数和650,000个神经元的神经网络由五个卷积层组成,其中一些随后是最大池化层,三个全连接层以及最后的1000个softmax输出。为了加快训练速度,我们使用非饱和神经元和能高效进行卷积运算的GPU实现。为了减少全连接层中的过拟合,我们采用了最近开发的称为“dropout”的正则化方法,该方法证明是非常有效的。我们还在ILSVRC-2012比赛中使用了这种模式的一个变种,取得了15.3%的前五名测试失误率,而第二名的成绩是26.2%。

1 介绍

目前,机器学习方法对物体识别非常重要。为了改善他们的表现,我们可以收集更大的数据集,训练更强大的模型,并使用更好的技术来防止过拟合。直到最近,标记好图像的数据集相对还较小——大约上万的数量级(例如,NORB,Caltech-101/256 和CIFAR-10/100)。使用这种规模的数据集可以很好地解决简单的识别任务,特别是如果他们增加了保留标签转换(label-preserving transformations)。例如,目前MNIST数字识别任务的最低错误率(<0.3%)基本达到了人类的识别水平。但是物体在现实环境中可能表现出相当大的变化性,所以要学会识别它们,就必须使用更大的训练集。事实上,小图像数据集的缺点已是众所周知(例如,Pinto),但直到最近才可以收集到数百万的标记数据集。新的大型数据集包括LabelMe ,其中包含数十万个完全分割的图像,以及ImageNet,其中包含超过15,000万个超过22,000个类别的高分辨率图像。

要从数百万图像中学习数千个类别,我们需要一个具有强大学习能力的模型。然而,物体识别任务的巨大复杂性意味着即使是像ImageNet这样大的数据集也不能完美地解决这个问题,所以我们的模型也需要使用很多先验知识来弥补我们数据集不足的问题。卷积神经网络(CNN)就构成了一类这样的模型。它们的容量可以通过改变它们的深度和宽度来控制,并且它们也对图像的性质(即统计量的定态假设以及像素局部依赖性假设)做出准确而且全面的假设。因此,与具有相同大小的层的标准前馈神经网络相比,CNN具有更少的连接和参数,因此它们更容易训练,而其理论最优性能可能稍微弱一些。

尽管CNN具有很好的质量,并且尽管其局部结构的效率相对较高,但将它们大规模应用于高分辨率图像时仍然显得非常昂贵。幸运的是,当前的GPU可以用于高度优化的二维卷积,能够加速许多大型CNN的训练,并且最近的数据集(如ImageNet)包含足够多的标记样本来训练此类模型,而不会出现严重的过度拟合。

本文的具体贡献如下:我们在ILSVRC-2010和ILSVRC-2012比赛中使用的ImageNet子集上训练了迄今为止最大的卷积神经网络之一,并在这些数据集上取得了迄今为止最好的结果。我们编写了一个高度优化的2D卷积的GPU实现以及其他训练卷积神经网络的固有操作,并将其公开。我们的网络包含许多新的和不同寻常的功能,这些功能可以提高网络的性能并缩短训练时间,详情请参阅第3节。我们的网络规模较大,即使有120万个带标签的训练样本,仍然存在过拟合的问题,所以我们采用了几个有效的技巧来阻止过拟合,在第4节中有详细的描述。我们最终的网络包含五个卷积层和三个全连接层,并且这个深度似乎很重要:我们发现去除任何卷积层(每个卷积层只包含不超过整个模型参数的1%的参数)都会使网络的性能变差。

最后,网络的规模主要受限于目前GPU上可用的内存量以及我们可接受的训练时间。我们的网络需要在两块GTX 580 3GB GPU上花费五到六天的时间来训练。我们所有的实验都表明,通过等待更快的GPU和更大的数据集出现,我们的结果可以进一步完善。

2 数据集

ImageNet是一个拥有超过1500万个已标记高分辨率图像的数据集,大概有22,000个类别。图像都是从网上收集,并使用Amazon-Mechanical Turk群智工具人工标记。从2010年起,作为Pascal视觉对象挑战赛的一部分,这是每年举办一次的名为ImageNet大型视觉识别挑战赛(ILSVRC)的比赛。 ILSVRC使用的是ImageNet的一个子集,每1000个类别中大约有1000个图像。总共有大约120万张训练图像,50,000张验证图像和150,000张测试图像。

ILSVRC-2010是ILSVRC中的唯一可以使用测试集标签的版本,因此这也正是我们进行大部分实验的版本。由于我们也在ILSVRC-2012比赛中引入了我们的模型,因此在第6部分中,我们也会给出此版本数据集的结果,尽管这个版本的测试集标签不可用。在ImageNet上,习惯上使用两种错误率:top-1和top-5,其中top-5错误率是正确标签不在被模型认为最可能的五个标签之中的测试图像的百分率。

ImageNet由可变分辨率的图像组成,而我们的系统需要固定的输入尺寸。因此,我们将图像下采样到256×256的固定分辨率。给定一个矩形图像,我们首先重新缩放图像,使得短边长度为256,然后从结果中裁剪出中心的256×256的图片。除了将每个像素中减去训练集的像素均值之外,我们没有以任何其他方式对图像进行预处理。所以我们在像素的(中心)原始RGB值上训练了我们的网络。

3 结构

图2概括了我们所提出网络的结构。它包含八个学习层——五个卷积层和三个全连接层。下面,我们将描述一些所提出网络框架中新颖或不寻常的地方。 3.1-3.4节按照我们对它们重要性的估计进行排序,其中最重要的是第一个。

3.1 ReLU非线性单元

对一个神经元模型的输出的常规方法是,给他接上一个激活函数: f ( x ) = t a n h ( x ) f(x)=tanh(x) f(x)=tanh(x)或者 f ( x ) = ( 1 + e − x ) − 1 f(x)=(1+e^{−x})^{−1} f(x)=(1+ex)1。就梯度下降法的训练时间而言,这些饱和非线性函数比非饱和非线性函数如 f ( x ) = m a x ( 0 , x ) f(x)=max(0,x) f(x)=max(0,x)慢得多。根据Nair和Hinton的说法,我们将这种非线性单元称为——修正非线性单元(Rectified Linear Units (ReLUs))。使用ReLUs做为激活函数的卷积神经网络比起使用tanh单元作为激活函数的训练起来快了好几倍。这个结果从图1中可以看出来,该图展示了对于一个特定的四层CNN,CIFAR-10数据集训练中的误差率达到25%所需要的迭代次数。从这张图的结果可以看出,如果我们使用传统的饱和神经元模型来训练CNN,那么我们将无法为这项工作训练如此大型的神经网络。

在这里插入图片描述

我们并不是第一个考虑在CNN中替换掉传统神经元模型的。例如,Jarrett等人表示,非线性函数 f ( x ) = ∣ t a n h ( x ) ∣ f(x)=|tanh(x)| f(x)=tanh(x)在他们的对比度归一化问题上,再接上局部均值池化单元,在Caltech-101数据集上表现的非常好。然而,在这个数据集中,主要担心的还是防止过拟合,所以他们观察到的效果与我们在使用ReLU时观察到的训练集的加速能力还是不一样。加快训练速度对大型数据集上训练的大型模型的性能有很大的影响。

3.2 在多个GPU上训练

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

由此产生的架构有点类似于Cire¸san等人使用的“柱状”CNN,除了我们的每列不是独立的之外(见图2)。与一个GPU上训练的每个卷积层只有一半的内核数量的网络相比,该方案分别将我们的top-1和top-5错误率分别降低了1.7%和1.2%。双GPU网络的训练时间比单GPU网络更少。

3.3 局部响应归一化

ReLU具有理想的属性,它们不需要对输入进行归一化来防止它们饱和。如果至少有一些训练实例为ReLU产生了正的输入,那么这个神经元就会学习。然而,我们还是发现下面的这种归一化方法有助于泛化。设 a x , y i a^{i}_{x,y} ax,yi表示第 i i i个内核计算 ( x , y ) (x,y) (x,y)位置的ReLU非线性单元的输出,而响应归一化(Local Response Normalization)的输出值定义为 b x , y i b^{i}_{x,y} bx,yi

b x , y i = a x , y i ( k + α ∑ 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+α\sum ^{min(N−1,i+n/2)}_{max(0,i−n/2)}(a^{j}_{x,y})^2)^β} bx,yi=(k+αmax(0,in/2)min(N1,i+n/2)(ax,yj)2)βax,yi

其中,求和部分公式中的 n n n表示同一个位置下与该位置相邻的内核映射的数量,而 N N N表示这一层所有的内核数(即通道数)。内核映射的顺序当然是任意的,并且在训练之前就已经定好了。这种响应归一化实现了一种模仿真实神经元的横向抑制,从而在使用不同内核计算的神经元输出之间产生较大的竞争。常数 k、 n n n α α α β β β都是超参数(hyper-parameters),它们的值都由验证集决定。我们取 k = 2 k=2 k=2 n = 5 n=5 n=5 α = 1 0 − 4 α=10^{−4} α=104 β = 0.75 β=0.75 β=0.75。我们在某些层的应用ReLU后再使用这种归一化方法(参见第3.5节)。

这个方案与Jarrett等人的局部对比归一化方案有些相似之处,但我们的被更准确地称为“亮度归一化”,因为我们没有减去均值。响应归一化将我们的top-1和top-5的错误率分别降低了1.4%和1.2%。我们还验证了这种方案在CIFAR-10数据集上的有效性:没有进行归一化的四层CNN实现了13%的测试错误率,而进行了归一化的则为11%。

3.4 重叠池化

CNN中的池化层汇集了相同内核映射中相邻神经元组的输出。在传统方法中,相邻池化单元之间互不重叠。更准确地说,一个池化层可以被认为是由一些间隔为 s s s个像素的池化单元组成的网格,每个都表示了一个以池化单元的位置为中心的大小为 z × z z×z z×z的邻域。如果我们令 s = z s = z s=z,我们就可以得到CNN中常用的传统的局部池化。如果我们令 s < z s <z s<z,则获得重叠池。 这就是我们在整个过程中使用的网络,其中 s = 2 s = 2 s=2 z = 3 z =3 z=3。该方案将top-1和top-5的错误率分别降低了0.4%和0.3%,并且与非重叠方案 s = 2 , z = 2 s = 2,z=2 s=2,z=2相比,产生相同维度尺寸的输出。 我们通常会在训练期间观察到重叠的模型汇集发现它可以轻微防止过拟合。

3.5 整体结构

现在我们已经准备好描述CNN的整体架构了。如图2所示,这个网络包含了八层权重;前五个是卷积层,其余三个为全连接层。最后的全连接层的输出被送到1000维的softmax函数,其产生1000个类的预测。我们的网络最大化多项逻辑回归目标,这相当于在预测的分布下最大化训练样本中正确标签对数概率的平均值。

第二,第四和第五个卷积层的内核仅与上一层存放在同一GPU上的内核映射相连(见图2)。第三个卷积层的内核连接到第二层中的所有内核映射。全连接层中的神经元连接到前一层中的所有神经元。响应归一化层紧接着第一个和第二个卷积层。 在3.4节中介绍的最大池化层,后面连接响应归一化层以及第五个卷积层。将ReLU应用于每个卷积层和全连接层的输出。

在这里插入图片描述

第一个卷积层的输入为224×224×3的图像,对其使用96个大小为11×11×3、步长为4(步长表示内核映射中相邻神经元感受野中心之间的距离)的内核来处理输入图像。第二个卷积层将第一个卷积层的输出(响应归一化以及池化)作为输入,并使用256个内核处理图像,每个内核大小为5×5×48。第三个、第四个和第五个卷积层彼此连接而中间没有任何池化或归一化层。第三个卷积层有384个内核,每个的大小为3×3×256,其输入为第二个卷积层的输出。第四个卷积层有384个内核,每个内核大小为3×3×192。第五个卷积层有256个内核,每个内核大小为3×3×192。全连接层各有4096个神经元。

4 减少过拟合

我们的神经网络架构拥有6000万个参数。尽管ILSVRC的1000个类别使得每个训练样本从图像到标签的映射被限制在了10 bit之内,但这不足以保证训练这么多参数而不出现过拟合。下面,我们将介绍对付过度拟合的两个方法。

4.1 数据增强(Data Augmentation)

减小过拟合的最简单且最常用的方法就是,使用标签保留转换(label-preserving transformations),人为地放大数据集。我们采用两种不同形式的数据增强方法,它们都允许通过很少的计算就能从原始图像中生成转换图像,所以转换后的图像不需要存储在硬盘上。在我们实现过程中,转换后的图像是使用CPU上的Python代码生成的,在生成这些转换图像的同时,GPU还在训练上一批图像数据。所以这些数据增强方案实际上是很高效的。

数据增强的第一种形式包括平移图像和水平映射。我们通过从256×256图像中随机提取224×224的图像块(及其水平映射)并在这些提取的图像块上训练我们的网络来做到这一点。这使我们的训练集的规模增加了2048倍,尽管由此产生的训练样本当然还是高度相互依赖的。如果没有这个方案,我们的网络就可能会遭受大量的的过拟合,可能会迫使我们不得不使用更小的网络。在测试时,网络通过提取5个224×224的图像块(四个角块和中心块)以及它们的水平映射(因此总共包括10个块)来进行预测,并求网络的softmax层的上的十个预测结果的均值。

第二种形式的数据增强包括改变训练图像中RGB通道的灰度。具体而言,我们在整个ImageNet训练集的图像的RGB像素值上使用PCA。对于每个训练图像,我们添加多个通过PCA找到的主成分,大小与相应的特征值成比例,乘以一个随机值,该随机值属于均值为0、标准差为0.1的高斯分布。因此,对于每个图像的RGB像素有: I x y = [ I x y R I G x y I x y B ] T I_{xy}=[I^{R}_{xy} \quad I^{G}{xy} \quad I^{B}_{xy}]^T Ixy=[IxyRIGxyIxyB]T,我们加入如下的值:
[ p 1 p 2 p 3 ] [ α 1 λ 1 α 2 λ 2 α 3 λ 3 ] T [p_1\quad p_2 \quad p_3][\alpha_1\lambda_1 \quad \alpha_2\lambda_2 \quad \alpha_3\lambda_3]^T [p1p2p3][α1λ1α2λ2α3λ3]T

其中, p i p_i pi λ i \lambda_i λi分别是3x3的RGB协方差矩阵的第 i i i个特征向量和第 i i i个的特征值,而 λ i \lambda_i λi是前面所说的随机值。对于一张特定图像中的所有像素,每个 λ i \lambda_i λi只会被抽取一次,知道这张图片再次用于训练时,才会重新提取随机变量。这个方案近似地捕捉原始图像的一些重要属性,对象的身份不受光照的强度和颜色变化影响。这个方案将top-1错误率降低了1%以上。

4.2 Dropout

结合许多不同模型的预测结果是减少测试错误率的一种非常成功的方法,但对于已经花费数天时间训练的大型神经网络来说,它似乎成本太高了。然而,有一种非常有效的模型组合方法,在训练期间,只需要消耗1/2的参数。这个新发现的技术叫做“Dropout”,它会以50%的概率将隐含层的神经元输出置为0。以这种方法被置0的神经元不参与网络的前馈和反向传播。因此,每次给网络提供了输入后,神经网络都会采用一个不同的结构,但是这些结构都共享权重。这种技术减少了神经元的复杂适应性,因为神经元无法依赖于其他特定的神经元而存在。因此,它被迫学习更强大更鲁棒的功能,使得这些神经元可以与其他神经元的许多不同的随机子集结合使用。在测试时,我们试着使用了所有的神经元,并将它们的输出乘以0.5。这与采用大量dropout的网络产生的预测结果分布的几何均值近似。

我们在图2中的前两个全连接层上使用了dropout。没有dropout,我们的网络会出现严重的过拟合。Dropout大概会使达到收敛的迭代次数翻倍。

5 训练细节

我们使用随机梯度下降法来训练我们的模型,每个batch有128个样本,动量(momentum)为0.9,权重衰减(weight decay)为0.0005。我们发现这种较小的权重衰减对于模型的训练很重要。换句话说,权重衰减在这里不仅仅是一个正则化方法:它减少了模型的训练误差。权重 ω \omega ω的更新法则是:
v i + 1 : = 0.9 ⋅ v i − 0.0005 ⋅ ϵ ⋅ ω i − ϵ ⋅ ⟨ ∂ L ∂ ω ∣ ω i ⟩ D i ω i + 1 : = ω i + v i + 1 v_{i+1}:=0.9 \cdot v_i−0.0005 \cdot \epsilon \cdot \omega_i−\epsilon \cdot \left \langle \frac{\partial L}{\partial \omega}|_{\omega_i}\right \rangle_{D_i}\\ \omega_{i+1}:=\omega_i+v_{i+1} vi+1:=0.9vi0.0005ϵωiϵωLωiDiωi+1:=ωi+vi+1

其中, i i i表示当前的迭代次数, v v v表示动量(momentum), ϵ \epsilon ϵ表示学习率, ⟨ ∂ L ∂ ω ∣ ω i ⟩ D i \left \langle \frac{\partial L}{\partial \omega}|_{\omega_i}\right \rangle_{D_i} ωLωiDi是第 i i i批次的目标函数关于 ω \omega ω的导数( ω i \omega_i ωi的偏导数 D i D_i Di的平均值。

我们使用标准差为0.01、均值为0的高斯分布来初始化各层的权重。我们使用常数1来初始化了网络中的第二个、第四个和第五个卷积层以及全连接层中的隐含层中的所有偏置参数。这种初始化权重的方法通过向ReLU提供了正的输入,来加速前期的训练。我们使用常数0来初始化剩余层中的偏置参数。

我们对所有层都使用相同的学习率,在训练过程中又手动进行了调整。我们遵循的启发式方法是:以当前的学习速率训练,验证集上的错误率停止降低时,将学习速率除以10.学习率初始时设为0.01,并且在终止前减少3次。我们使用120万张图像的训练集对网络进行了大约90次迭代的训练,这在两块NVIDIA GTX 580 3GB GPU上花费了大约5到6天的时间。

6 结果

我们在ILSVRC-2010上取得的结果如表1所示。我们的网络的top-1和top-5测试集错误率分别为37.5%和17.0%。在ILSVRC-2010比赛期间取得的最佳成绩是47.1%和28.2%,其方法是对六种不同的稀疏编码模型所产生的预测结果求平均。此后公布的最佳结果为45.7%、25.7%,其方法是对两种经过密集采样的特征计算出来的Fisher向量(FV)训练的两个分类器取平均值。

我们的网络实现了37.5%和17.0%的前1和前5个测试集错误率5。在ILSVRC-2010比赛期间取得的最佳成绩是47.1%和28.2%,其中一种方法是对六种针对不同特征进行训练的稀疏编码模型所产生的预测进行平均,此后最佳公布结果为45.7%, 25.7%,其中一种方法是:对两个在不同取样密度的Fisher向量上训练的分类器取平均。
在这里插入图片描述
我们还在ILSVRC-2012竞赛中使用了我们的模型,并在表2中给出了我们的结果。由于ILSVRC-2012测试集标签未公开,因此我们无法给出我们测试过的所有模型在测试集上的错误率。在本节的其余部分中,我们将验证集和测试集的错误率互换,因为根据我们的经验,它们之间的差值不超过0.1%(见表2)。本文描述的CNN的top-5错误率达到了18.2%。对五个相似CNN的预测结果计算均值,得到的错误率为16.4%。单独一个CNN,在最后一个池化层之后,额外添加第六个卷积层,对整个ImageNet Fall 2011 release(15M images, 22K categories)进行分类,然后在ILSVRC-2012上“微调”(fine-tuning)网络,得到的错误率为16.6%。对整个ImageNet Fall 2011版本的数据集下预训练的两个CNN,求他们输出的预测值与前面提到的5个不同的CNN输出的预测值的均值,得到的错误率为15.3%。比赛的第二名达到了26.2%的top-5错误率,他们的方法是:对几个在特征取样密度不同的Fisher向量上训练的分类器的预测结果取平均的方法。
在这里插入图片描述
最后,我们还在ImageNet Fall 2009版本的数据集上提交了错误率,总共有10,184个类别和890万张图像。在这个数据集中,我们遵循文献中的使用一半图像用于训练,一半图像用于测试的惯例。由于没有建立测试集,所以我们的拆分方法有必要与先前作者使用的拆分方法不同,但这并不会对结果产生显著的影响。我们在这个数据集上的top-1和top-5错误率分别是67.4%和40.9%,是通过前面描述的网络获得的,但是在最后的池化层上还有额外的第6个卷积层。该数据集此前公布的最佳结果是78.1%和60.9%。

6.1 定性评估

在这里插入图片描述
图3显示了由网络的两个数据连接层学习得到的卷积内核。该网络已经学习到许多频率和方向提取的内核,以及各种色块。请注意两个GPU所展现的不同特性,这也是3.5节中介绍的限制互连的结果。GPU1上的内核在很大程度上与颜色无关,然而GPU2上的内核在很大程度上都于颜色有关。这种特异性在每次迭代期间都会发生,并且独立于任何特定的随机权重初始化过程(以GPU的重新编号为模)。

在这里插入图片描述
在图4的左边,我们通过计算8张测试图像的top-5预测来定性评估网络的训练结果。请注意,即使是偏离中心的物体,如左上角的螨虫,也可以被网络识别出来。大多数top-5的标签都显得比较合理。例如,只有其他类型的猫才被认为是豹子的可能标签。在某些情况下(栅栏、樱桃),照片的关注点存在模糊性,不知道到底该关注哪个。

另一个研究可视化的网络的方法是,考虑由最后一个4096维隐含层中的图像的特征的激活函数输出值。如果两幅图像产生有的欧氏距离,我们可以认为高层次的神经网络认为它们是相似的。图4显示了测试集中的5个图像和来袭训练集的6个图像,这些图像根据这种度量方法来比较它们中的哪一个与其最相似。请注意,在像素层次上,待检测的训练图像通常不会与第一列中的查询图像有较小的L2距离。例如,检索到的狗和大象有各种不同的姿势。我们在补充材料中提供了更多测试图像的结果。
通过使用欧式距离来计算两个4096维实值向量的相似性,效率不高,但是通过训练自编码器可以将这些向量压缩为较短的二进制码,能够使其更高效。与应用自编码器到原始像素[14]相比,这应该是更好的图像检索方法。它不使用图像标签,因此更秦翔宇检索具有相似图案边缘的图像,不管它们的图像语义是否相似。

7 讨论

我们的研究结果表明,一个大的深层卷积神经网络能够在纯粹使用监督学习的情况下,在极具挑战性的数据集上实现破纪录的结果。值得注意的是,如果移除任何一个卷积层,网络的性能就会下降。例如,删除任何中间层的结果会导致网络性能的top-1错误率下降2%。因此网络的深度对于实现我们的结果真的很重要。

为了简化我们的实验,我们没有使用任何无监督的预训练方法,尽管这样可能会有所帮助,特别是如果我们获得了足够的计算能力来显著地增加网络的大小而不会相应地增加已标记数据的数量。到目前为止,我们的结果已经获得了足够的进步,因为我们已经使网络更大,并且训练了更长时间。但我们仍然有很大的空间去优化网络,使之能够像人类的视觉系统一样感知。最后,我们希望对视频序列使用非常大的深度卷积神经网路,其中时间结构提供了非常有用的信息,这些信息往往在静态图像中丢失了,或者说不太明显。

References


二、论文解读

1 卷积层

1.1 CNN中卷积层的作用

CNN中的卷积层,在很多网络结构中会用conv来表示,也就是convolution的缩写。卷积层在CNN中扮演着很重要的角色——特征的抽象和提取。在传统机器学习算法中,需要人为的指定特征是什么,而在卷积神经网络中,大部分特征提取的工作在卷积层自动完成了,越深越宽的卷积层一般来说就会有更好的表达能力。

1.1.1 卷积层如何操作

CNN中的卷积层操作与图像处理中的卷积是一样的,都是一个卷积核对图像做自上而下,自左而右的加权和操作。

  • 卷积核的厚度=被卷积的图像的通道数
  • 卷积核的个数=卷积操作后输出的通道数

例如:输入图像尺寸 5 × 5 × 3 5\times5\times3 5×5×3(宽/高/通道数),卷积核尺寸: 3 × 3 × 3 3\times3\times3 3×3×3(宽/高/厚度),步长:1,边界填充:0,卷积核数量:1。用这样的一个卷积核去卷积图像中某一个位置后,是将该位置上宽3,高3,通道3上27个像素值分别乘以卷积核上27个对应位置的参数,得到一个数,依次滑动,得到卷积后的图像,这个图像的通道数为1(与卷积核个数相同),图像的高宽尺寸如下公式:
⌊ 5 − 3 + 2 × 0 1 ⌋ + 1 = 3 \lfloor \frac{5-3+2\times0 }{1} \rfloor+1=3 153+2×0+1=3

所以,卷积后的图像尺寸为: 3 × 3 × 1 3\times3\times1 3×3×1(宽/高/通道数)。

1.2 AlexNet中的卷积层

论文原文中的图:
在这里插入图片描述

输入层: 227 × 227 × 3 227\times227\times3 227×227×3
C1: 96 × 11 × 11 × 3 96\times11\times11\times3 96×11×11×3 (卷积核个数/宽/高/厚度)
C2: 256 × 5 × 5 × 48 256\times5\times5\times48 256×5×5×48(卷积核个数/宽/高/厚度)
C3: 384 × 3 × 3 × 256 384\times3\times3\times256 384×3×3×256(卷积核个数/宽/高/厚度)
C4: 384 × 3 × 3 × 192 384\times3\times3\times192 384×3×3×192(卷积核个数/宽/高/厚度)
C5: 256 × 3 × 3 × 192 256\times3\times3\times192 256×3×3×192(卷积核个数/宽/高/厚度)

细化的图:
细化的结构图

1.2.1 conv1层
  1. 输入Input的图像规格: 224 × 224 × 3 224\times 224\times3 224×224×3(RGB图像),实际上会经过预处理变为 227 × 227 × 3 227\times 227\times3 227×227×3
  2. 使用的96个大小规格为 11 × 11 11\times 11 11×11的过滤器filter,或者称为卷积核,进行特征提取,(ps:图上之所以看起来是48个是由于采用了2个GPU服务器处理,每一个服务器上承担了48个).需要特别提一下的是,原始图片为RBG图像,也就是三个通道的,我们这96个过滤器也是三通道的,也就是我们使用的实际大小规格为 11 × 11 × 3 11\times 11\times3 11×11×3,也就是原始图像是彩色的,我们提取到的特征也是彩色的,在卷积的时候,我们会依据这个公式来提取特征图: ⌊ ( i m g s i z e − f i l t e r s i z e ) s t r i d e ⌋ + 1 = n e w _ f e a t u r e s i z e \lfloor \frac{(img_{size} - filter_{size})}{stride} \rfloor+1 = new\_feature_{size} stride(imgsizefiltersize)+1=new_featuresize,所以这里我们得到的特征图大小为:
  • ⌊ ( 227 − 11 ) / 4 + 1 = 55 ⌋ \lfloor (227-11) / 4 + 1= 55 \rfloor (22711)/4+1=55 注意 ⌊ ⌋ \lfloor \rfloor 表示向下取整. 我们得到的新的特征图规格为 55 × 55 55\times55 55×55,注意这里提取到的特征图是彩色的.这样得到了96个 55 × 55 55\times55 55×55大小的特征图了,并且是RGB通道的.
  1. 使用RELU激励函数,来确保特征图的值范围在合理范围之内,比如{0,1},{0,255}, 最后还有一个LRN处理。
  2. 降采样处理(pool层也称为池化)
  3. 使用LRN,中文翻译为局部区域归一化,对降采样的特征图数据进行
1.2.2 conv2层
  • conv2和conv1不同,conv2中使用256个 5 × 5 5\times5 5×5大小的过滤器filter对 96 × 27 × 27 96\times27\times27 96×27×27个特征图,进行进一步提取特征,但是处理的方式和conv1不同,过滤器是对96个特征图中的某几个特征图中相应的区域乘以相应的权重,然后加上偏置之后所得到区域进行卷积,经过这样卷积之后,然后在宽度高度两边都填充2像素,会的到一个新的256个特征图.
  • 特征图的大小为: ⌊ 27 + 2 × 2 − 5 1 ⌋ + 1 = 27 \lfloor \frac{27+2\times2 - 5}{1} \rfloor+1 = 27 127+2×25+1=27,也就是会有256个 27 × 27 27\times27 27×27大小的特征图.然后进行ReLU操作.再进行降采样pool处理
    得到: ⌊ 27 − 3 2 ⌋ + 1 = 13 \lfloor \frac{27-3}{2} \rfloor+1 = 13 2273+1=13 也就是得到256个 13 × 13 13\times13 13×13大小的特征图.
1.2.3 conv3层
  • ⌊ 13 + 2 × 1 − 3 1 ⌋ + 1 = 13 \lfloor \frac{13 + 2\times 1 - 3}{1} \rfloor+1 = 13 113+2×13+1=13 也就是得到384个 13 × 13 13\times13 13×13大小的特征图.
  • conv3没有使用降采样层.
1.2.4 conv4 层
  • ⌊ 13 + 2 × 1 − 3 1 ⌋ + 1 = 13 \lfloor \frac{13 + 2\times 1 - 3}{1} \rfloor+1 = 13 113+2×13+1=13,384个 13 × 13 13\times13 13×13特征图。
  • conv4没有使用降采样层.
1.2.5 conv5层
  • conv5有降采样层pool,防止过拟合
  • ⌊ 13 − 3 2 ⌋ + 1 = 6 \lfloor \frac{13 - 3}{2} \rfloor+1 = 6 2133+1=6,384个 6 × 6 6\times6 6×6特征图。

2 全连接层

2.1 全连接层的作用

CNN中的全连接层与浅层神经网络中的作用是一样的,负责逻辑推断,所有的参数都需要学习得到。有一点区别在于第一层的全连接层用于链接卷积层的输出,它还有一个作用是去除空间信息(通道数),是一种将三维矩阵变成向量的过程(一种全卷积操作),其操作如下:
在这里插入图片描述
输入图像是 W × H × C W\times H \times C W×H×C,那么卷积核的尺寸为 W × H × C W\times H\times C W×H×C,这样的话整个输入图像就变成了一个数,一共有 k k k 个数(第一层全连接层后的神经元个数),就有 k k k个这样的 W × H × C W\times H\times C W×H×C 的卷积核。

2.2 AlexNet中的全连接层

AlexNet结构,R1,R2,R3就是全连接层。R2,R3很好理解,在这里主要说明下R1输入层:

  • 输入图像: 13 × 13 × 256 13\times13\times256 13×13×256
  • 卷积核尺寸: 13 × 13 × 256 13\times13\times256 13×13×256, 个数 2048 × 2 2048\times2 2048×2
  • 输出尺寸:4096(列向量)
    从最开始的结构中可以看到,R1中也有通道的交互:
    所以串接后的通道数是256,全卷积的卷积核尺寸也就是 13 × 13 × 256 13\times13\times256 13×13×256,一个有4096个这样尺寸的卷积核分别对输入图像做4096次的全卷积操作,最后的结果就是一个列向量,一共有4096个数。
2.2.1 fc6层

描述一下:

  • 这里使用4096个神经元,对256个大小为 6 × 6 6\times6 6×6特征图,进行一个全连接,也就是将 6 × 6 6\times6 6×6大小的特征图,进行卷积变为一个特征点,
  • 然后对于4096个神经元中的一个点,是由256个特征图中某些个特征图卷积之后得到的特征点乘以相应的权重之后,再加上一个偏置得到。
  • 再进行一个dropout随机从4096个节点中丢掉一些节点信息(也就是值清0),然后就得到新的4096个神经元。
2.2.2 fc7层:

和fc6类似.

2.2.3 fc8层:
  • 采用的是1000个神经元,然后对fc7中4096个神经元进行全链接,然后会通过高斯过滤器,得到1000个float型的值,也就是我们所看到的预测的可能性,

  • 如果是训练模型的话,会通过标签label进行对比误差,然后求解出残差,再通过链式求导法则,将残差通过求解偏导数逐步向上传递,并将权重进行推倒更改,类似与BP网络思虑,然后会逐层逐层的调整权重以及偏置.

3 其它层

严格上说池化层与卷积层不属于CNN中的单独的层,也不记入CNN的层数内,所以我们一般直说AlexNet一共8层,有5层卷积层与3层全连接层。但是在这里为了逻辑上清晰,就把他们单独拿出来说明下:

3.1 池化层

池化操作(Pooling)用于卷积操作之后,其作用在于特征融合和降维,其实也是一种类似卷积的操作,只是池化层的所有参数都是超参数,都是不用学习得到的。

在这里插入图片描述
上面这张图解释了最大池化(Max Pooling)的操作过程,核的尺寸为 2 × 2 2\times2 2×2,步长为2,最大池化的过程是将 2 × 2 2\times2 2×2 尺寸内的所有像素值取最大值,作为输出通道的像素值。除了最大池化外,还有平均池化(Average Pooling),也就是将取最大改为取平均。一个输入为 224 × 224 × 64 224\times224\times64 224×224×64 的图像,经过最大池化后的尺寸变为 112 × 112 × 64 112\times112\times64 112×112×64,可以看到池化操作的降维改变的是图像的宽高,而不改变通道数。

3.2 激活层

池化操作用于卷积层内,而激活操作则在卷积层和全连接层都会用到。激活函数在神经网络中的功能即通过对加权的输入进行非线性组合产生非线性决策边界(non-linear decision boundary)。使用的是ReLu(Rectified Linear Units)函数,主要是为了解决Sigmoid函数带来的梯度消失问题。在这里插入图片描述
在全连接层中的激活过程就很好理解了,因为全连接层内所有的神经元的输出都是一个数,只要这个数x>0,则x=x;x<0,则x=0。
在卷积层中的激活针对的是每一个像素值,比如某卷积层输出中某个通道中i行j列像素值为x,只要这个数x>0,则x=x;x<0,则x=0。

3.3 Softmax层

3.3.1 Softmax作用

Softmax层也不属于CNN中单独的层,一般要用CNN做分类的话,Softmax 是将神经元的输出变成概率的形式:
σ ( z ) j = e z j ∑ k = 1 K e z k , j = 1 , ⋯   , K \sigma(z)_j = \frac{e^{z_j}}{\sum_{k=1}^{K}e^{z_k}}, j=1,\cdots,K σ(z)j=k=1Kezkezj,j=1,,K
Softmax层所有的输出相加为1,即
∑ j = 0 k σ ( z ) j = 1 \sum_{j=0}^{k} \sigma(z)_j = 1 j=0kσ(z)j=1
而某一个输出的就是概率,最后我们按照这个概率的大小确定到底属于哪一类。

3.3.2 AlexNet中的Softmax

AlexNet最后的分类数目为1000,也就是最后的输出为1000,输入为4096,中间通过R3链接,R3就是最后一层了,全连接的第3层,所有层数的第8层。

4 AlexNet与在其之前的神经网络相比改进

  1. 数据增广(Data Augmentation)
    常用的数据增强的方法有 水平翻转、随机裁剪、平移变换、颜色、光照、对比度变换

  2. Dropout
    有效防止过拟合。

  3. Relu激活函数
    用ReLU代替了传统的Sigmoid或者tanh激活函数。

  4. Local Response Normalization 局部响应归一化
    参考了生物学上神经网络的侧抑制的功能,做了临近数据归一化,提高来模型的泛化能力,这一功能的作用有争议(VGG)。

  5. Overlapping Pooling 重叠池化
    重叠池化减少了系统的过拟合,减少了top-5和top-1错误率的0.4%和0.3%。

  6. 多GPU并行训练
    AlexNet将网络分成了上下两部分,两部分的结构完全一致,这两部分由两块不同的GPU来训练,提高了训练速度。AlexNet大约有6000万个参数。

5. AlexNet 中60M参数

AlexNet只有8层,但是它需要学习的参数有60000000个,相比如他的层数,这是一个很可怕的数字了,我们来计算下这些参数都是怎么来的:

  • C1: 96 × 11 × 11 × 3 96\times11\times11\times3 96×11×11×3(卷积核个数/宽/高/厚度) 34848个
  • C2: 256 × 5 × 5 × 48 256\times5\times5\times48 256×5×5×48(卷积核个数/宽/高/厚度) 307200个
  • C3: 384 × 3 × 3 × 256 384\times3\times3\times256 384×3×3×256(卷积核个数/宽/高/厚度) 884736个
  • C4: 384 × 3 × 3 × 192 384\times3\times3\times192 384×3×3×192(卷积核个数/宽/高/厚度) 663552个
  • C5: 256 × 3 × 3 × 192 256\times3\times3\times192 256×3×3×192(卷积核个数/宽/高/厚度) 442368个
  • R1: 4096 × 6 × 6 × 256 4096\times6\times6\times256 4096×6×6×256(卷积核个数/宽/高/厚度) 37748736个
  • R2: 4096 × 4096 4096\times4096 4096×4096 16777216个
  • R3: 4096 × 1000 4096\times1000 4096×1000 4096000个

在R1中卷积核尺寸是 6 × 6 × 256 6\times6\times256 6×6×256 而不是 13 × 13 × 256 13\times13\times256 13×13×256是因为经过了最大池化。可以看到,全连接层(尤其是第一层)参数数量占了绝大部分。

6. Pytorch实现

import torch
import torch.nn as nn
import torchvision

class AlexNet(nn.Module):
    def __init__(self,num_classes=1000):
        super(AlexNet,self).__init__()
        self.feature_extraction = nn.Sequential(
            nn.Conv2d(in_channels=3,out_channels=96,kernel_size=11,stride=4,padding=2,bias=False),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=3,stride=2,padding=0),
            nn.Conv2d(in_channels=96,out_channels=192,kernel_size=5,stride=1,padding=2,bias=False),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=3,stride=2,padding=0),
            nn.Conv2d(in_channels=192,out_channels=384,kernel_size=3,stride=1,padding=1,bias=False),
            nn.ReLU(inplace=True),
            nn.Conv2d(in_channels=384,out_channels=256,kernel_size=3,stride=1,padding=1,bias=False),
            nn.ReLU(inplace=True),
            nn.Conv2d(in_channels=256,out_channels=256,kernel_size=3,stride=1,padding=1,bias=False),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=3, stride=2, padding=0),
        )
        self.classifier = nn.Sequential(
            nn.Dropout(p=0.5),
            nn.Linear(in_features=256*6*6,out_features=4096),
            nn.Dropout(p=0.5),
            nn.Linear(in_features=4096, out_features=4096),
            nn.Linear(in_features=4096, out_features=num_classes),
        )
    def forward(self,x):
        x = self.feature_extraction(x)
        x = x.view(x.size(0),256*6*6)
        x = self.classifier(x)
        return x


if __name__ =='__main__':
    model = AlexNet()
    print(model)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

三、CNN的发展

在这里插入图片描述

在AlexNet问世之后,CNN以一个很快的速度发展,截止到2017年,已经有了多代的网络结构问世,深度、宽度上也越来越大,效率和正确率上也越来越好:AlexNet—NiN—VGG—GoogLeNet—ResNet, 在这些结构中:

  • NiN 引入 1 × 1 1\times1 1×1卷积层(Bottleneck layer)和全局池化;
  • VGG将 7 × 7 7\times7 7×7替换成三个 3 × 3 3\times3 3×3
  • GoogLeNet引入了Inception模块;
  • ResNet引入了直连思想;
  • DenseNet引入稠密链接,将当前的层与之后的所有层直连。

其中的一些网络甚至替换了AlexNet中提出的一些思想,但是CNN大体上结构依旧遵循着AlexNet,甚至还有很多传统ANN的思想存在。

  • 收敛速度: V G G > I n c e p t i o n > D e n s e N e t > R e s N E T VGG>Inception>DenseNet>ResNET VGG>Inception>DenseNet>ResNET
  • 泛化能力: I n c e p t i o n ≈ D e n s e N e t ≈ R e s N e t > V G G Inception\approx DenseNet \approx ResNet >VGG InceptionDenseNetResNet>VGG
  • 运算量: I n c e p t i o n < D e n s e n e t < R e s N e t < V G G Inception<Densenet < ResNet<VGG Inception<Densenet<ResNet<VGG
  • 内存开销: I n c e p t i o n < R e s n e t < D e n s e N e t < V G G Inception<Resnet < DenseNet<VGG Inception<Resnet<DenseNet<VGG

参考

  1. AlexNet论文(ImageNet Classification with Deep Convolutional Neural Networks)(译)
  2. 《ImageNet Classification with Deep Convolutional Neural Networks》
  3. 神经网络模型之AlexNet的一些总结
  4. 从AlexNet理解卷积神经网络的一般结构
  5. AlexNet
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/691181
推荐阅读
相关标签
  

闽ICP备14008679号