ImageNet Classification with Deep Convolutional Neural Networks(AlexNet)

66 阅读24分钟

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。 img img

如果你需要这些资料,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

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

3. The Architecture(结构)

我们网络的体系结构如图2所示。它包含8个学习层-5个卷积层和3个全连接层。下面,我们将介绍我们网络架构的一些新颖或不寻常的功能。第3.1-3.4节根据我们对其重要性的估计进行排序,其中最重要的是第一部分。

3.1 ReLU Nonlinearity(ReLU 非线性)

将神经元的输出f建模为输入x的函数的标准方法是f(x)=tanh(x)f(x)=(1+e^{-x})^{-1}。就使用梯度下降的训练时间而言,这些饱和非线性函数比非饱和非线性函数f(x)=max(0,x)要慢得多。继Nair和Hinton之后,我们将具有这种非线性的神经元称为整流线行单元(ReLUs)。具有ReLU的深度卷积神经网络比具有tanh单元相同的网络快几倍。图1展示了这一点,图1显示了特定四层卷积神经网络在CIFAR-10数据集上达到25%训练误差所需的迭代次数。该图表明,如果我们使用传统的饱和神经元模型,我们就无法用这种大型神经网络进行实验。

图1:具有ReLU(实现)的四层卷积神经网络在CIFAR-10上达到25%的训练错误率,比具有tanh神经元的等效网络(虚线)快六倍。每个网络工作的学习率都是独立选择的,以便尽快进行训练。没有采用任何形式的正则化。此处演示的效果的大小因网络架构而异,但具有ReLU的网络始终比具有饱和神经元的等效网络快几倍。

我们不是第一个考虑CNN中传统神经元模型替代品的人。例如,Jarrett等人声称非线性f(x)=\left | tanh(x) \right |使用对比归一化类型随后跟着平均池化在Caltech-10数据集上工作相当好的。但是,在此数据集上,主要关注的是防止过度拟合,因此它们观察到的效果与我们在使用ReLU时报告的训练集的加速能力不同。更快的学习对在大型数据集上训练的大型模型的性能有很大影响。

3.2 Training on Multiple GPUs(在多个GPU上训练)

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

由此产生的结构有点类似于Cire,san等人采用的"柱状"CNN,除了我们的列不是独立的(见图2)。与在一个GPU上训练的每个卷积层中具有一半内核的网络相比,该方案将我们的top-1和top-5错误率分别降低了1.7%和1.2%。与单GPU网络相比,双GPU网络的训练时间略短。

(在最终的卷积层中,单GPU网络实际上具有与双GPU网络相同数量的内核。这是因为大多数网络参数都在第一个完全连接的层中,他将最后一个卷积层作为输入。因此,为了使两个网具有大致相同数量的参数,我们没有将最终卷积层的大小减半(也不是随后的全连接层)。因此,这种比较偏向于单GPU网络,因为它大于双GPU网络的”一半大小“。)

3.3 Local Response Normalization(局部响应归一化)

ReLU具有理想的属性,它们不需要输入归一化来防止它们饱和。如果至少一些训练样本对ReLU产生积极的输入,那么将在该神经元中进行学习。但是,我们仍然发现以下局部归一化方案有助于推广。a^{i}_{x,y}表示一个神经元应用在位置(x,y)的第i个内核并且应用ReLU非线性计算的激活值,响应的归一化激活b^{i}_{x,y}表达式为:

                                                    b^{i}{x,y}=a^{i}{x,y}/(k+\alpha \sum_{j=max(0,i-n/2)}^{min(N-1,i+n/2)}(a^{j}_{x,y})^{2})^{\beta }

其中总和在相同空间位置的n个”相邻“内核映射上运行,N是层中内核的总数。内核映射的顺序当然是任意的,并且在训练开始之前确定。这种响应归一化实现了一种横向抑制形式,其受到真实神经元的启发。从而在使用不同内核计算的神经元输出之间产生大的活跃的竞争。常数k,n,\alpha,\beta是超参数,它们的值使用验证集决定;我们使用k=2,n=5,\alpha =10^{-4},\beta =0.75。我们在某些层中应用这个归一化在应用ReLU非线性激活之后。

该方案与Jarrett等人的局部对比度归一化方案有一些相似之处,但我们更正确地称为”亮度归一化“,因为我们不减去平均激活值。响应归一化将我们的top-1和top-5错误率分别降低了1.4%和1.2%。我们还验证了该方案对CIFAR-10数据集的有效性:四层CNN在没有归一化的情况下实现了13%的测试错误率,在归一化方面实现了11%。(由于空间限制,我们无法详细描述此网络,但它有此处提供的代码和参数文件精确指定:code.google.com/p/cuda-conv…)

3.4 Overlapping Pooling(搭建池化层)

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

3.5 Overall Architecture(全部结构)

现在我们准备描述CNN的整体架构。如图2所示,网络包含具有权重的八层,前五层是卷积层,剩下的三层是全连接层。最后一个全连接层的输出被送到1000路的softmax中,产生1000个类别标签上的分布。我们的网络最大化多项逻辑回归目标,这相当于在预测分布下最大化训练案例中正确标签的对数概率的平均值。

图2:我们的CNN架构的例证,明确显示两个GPU之间的任务划分。一个GPU在图的顶部运行图层部分,而另一个GPU在底部运行图层部分。GPU仅在某些层进行通信。网络的输入是150,528维,网络剩余层中的神经元数量由253,440-186,624-64,896-64,896-43,264-4096-4096-1000.

第二,第四和第五卷积层的内核仅连接到位于同一GPU上的前一层中的那些内核映射上(参见图2)。第三卷积层的内核连接到第二层中的所有内核映射。全连接层中的神经元连接到前一层的所有的神经元。响应归一化层跟着第一和第二卷积层。3.4节中描述的最大池化层跟在响应归一化层和第五卷积层。ReLU非线性激活应用于每个卷积和全连接层的输出。第一个卷积层用96个大小为11\times 11\times 3的内核过滤224\times 224\times 3输入图像,步长为4个像素(这是内核图中相邻神经元的感受野中心之间的距离)。第二个卷积层将第一个卷积层的(响应归一化和池化)输出作为输入,并用256个大小为5\times 5\times 48的内核对其进行过滤。第三,第四和第五卷积层彼此连接而没有任何中间池化层或归一化层。第三卷积层具有384个大小为3\times 3\times 256的内核,其连接到第二卷积层(归一化,池化)输出。第四卷积层具有384个大小为3\times 3\times 192的内核,第五卷积层具有256个大小为3\times 3\times 192的内核。全连接层各有4096个神经元。

4. Reducing Overfitting(减少过拟合)

我们的神经网络架构有6000万个参数。尽管ILSVRC的1000个类别使得每个训练样本对从图像到标签的映射施加了10位约束,但是不足以证明学习如此多的参数而没有相当大的过度拟合。下面,我们描述了我们对抗过度拟合的两种主要方式:

4.1 Data Augmentation(数据增强)

减少图像数据过度拟合的最简单和最常用的方法是使用标签保留变换人工放大数据集。我们采用两种不同形式的数据增强,这两种形式都允许以非常小的计算从原始图像生成变换图像,因此转换后的图像不需要存储在磁盘上。在我们的实现中,转换的图像实在CPU上的Python代码中生成的,而GPU正在训练前一匹图像。

第一种形式的数据增强包括生成图像平移和水平反射。我们通过从256\times 256图像中提取随机224\times 224补丁(及其水平反射)并在这些提取的补丁上训练我们的图像来实现这一点(这是为什么输入图像的大小是224\times 224\times 3维的原因)。这使我们的训练集的大小增加了2048倍,尽管由此产生的训练样本当然是高度相互依赖的。如果没有这种方案,我们的网络就会遭受严重的过度拟合,这将迫使我们使用更小的网络。在测试时,网络通过通过提取五个224\times 224补丁(四个角的补丁和中心补丁)以及它们的水平反射(因此总共十个补丁)进行预测,并在十个补丁上对网络的softmax层进行预测求平均值。

第二种形式的数据增强包括改变训练图像中RGB通道的强度。具体来说,我们在整个ImageNet训练集中对RGB像素值执行PCA。对于每个训练图像,我们添加多个找到的主成分,其幅度与响应的特征值成正比乘以从高斯绘制的随机变量,其中平均值为零,标准差为0.1。因此对于每个TRGB图像像素I_{xy}=\left [ I^{R}{xy},I^{G}{xy},I^{B}_{xy} \right ]^{T}我们添加以下数量\left [ P_{1},P_{2},P_{3} \right ]\left [ \alpha _{1}\lambda _{1},\alpha _{2}\lambda _{2},\alpha _{3}\lambda _{3} \right ]^{T}。其中,P_{i}\lambda _{i}分别是RGB像素值的3\times 3协方差矩阵的第i个特征向量和特征值,\alpha _{i}是上述的随机变量。对于特定训练图像的所有像素,每个\alpha _{i}仅被绘制一次,直到该图像再次被用于训练,此时它被重新绘制。该方案近似的捕获自然图像的重要特性,即对象身份对于照明的强度和颜色的变化是不变的。该方案将top-1错误率降低了1%以上。

4.2 Dropout(随机失活)

结合许多不同模型的预测是减少测试误差的一种非常成功的方法,但对于已经需要训练数天的大型神经网络来着这种方法的代价太大了。然而,有一种非常有效的模型组合版本,在训练期间仅花费大约两倍的时间。最近引入的技术称为“dropout”,包括将每个隐藏神经元的输出设置为零,概率为0.5.以这种方式“删除”的神经元对前向传播没有贡献,并且不参加反向传播。因此,每次输入时,神经网络都会采样不同的架构,但所有这些架构都会共享权重。该技术减少了神经元的复杂共同适应,因为神经元不能依赖于特定其他神经元的存在。因此,它被迫学习更强大的特征,这些特征与其他神经元的许多不同随机子集一起使用时很有用的。在测试时,我们使用所有神经元但是将它们的输出乘以0.5,这是采用多指数dropout网络产生的预测分布的几何平均值的合理近似值。

我们在图2中的前两个全连接层中使用了“dropout”。没有“dropout”,我们的网络出现了严重的过拟合现象。“dropout”使收敛所需的迭代次数加倍。

5. Details of learning(学习的细节)

我们使用随机梯度下降训练我们的模型,批量大小为128个样本,动量为0.9,权重衰减为0.0005.我们发现,这种少量的重量衰减对于模型学习很重要。换句话说,这里的权重衰减不仅仅是一个正则化器:它减少了模型的训练错误。权重w的更新规则是

                                          v_{i+1}:=0.9\cdot v_{i}-0.0005\cdot \epsilon \cdot w_{i}-\epsilon \cdot \left \langle \frac{\partial L}{\partial w}\mid {w{i}} \right \rangle_{D_{i}}

                                                               w_{i+1}:=w_{i}+v_{i+1}

其中i是迭代索引,v是动量变量,\epsilon是学习率,并且\left \langle \frac{\partial L}{\partial w}\mid {w{i}} \right \rangle_{D_{i}}w的目标导数的第i批次的D_{i}的平均值,评估w_{i}

我们使用零均值高斯分布初始化每层中的权重,标准偏差为0.01。我们初始化了第二,第四和第五卷积层以及完全连接的隐藏层中的神经元偏差,其常数为1。该初始化通过向ReLU提供正输入来加速学习的早期阶段。我们用常数0初始化剩余层中的神经元偏差。

我们对所有层使用了相同的学习率,我们在整个训练过程中手动调整。我们遵循的启发是当验证错误率随着当前学习率停止改善时将学习率除以10。学习率初始化为0.01,并在终止前减少三次。我们通过120万张图像的训练集训练网络大约90个周期,在两个NVIDIA GTX 580 3GB GPU上花费了五到六天。

6. Results(结果)

我们在ILSVRC-2010上的结果总结在表1中。我们的网络实现了top-1和top-5的测试集错误率分别为37.5%和17.0%。在ILSVRC-2010竞赛期间取得的最佳表现为47.1%和28.2%。其中一种方法对从不同特征训练的六种稀疏编码模型产生的预测进行平均分析,此后最佳公布结果为45.7%,25.7%,这种方式平均了两种分类器的预测,这两种分类器是根据两种密集采样特征计算的Fisher矢量(FV)训练的。

表1:ILSVRC-2010测试集的结果比较,斜体使其他人获得的最佳结果。

我们也在ILSVRC-2012竞赛中输入了我们的模型,并在表2中报告了我们的结果。由于ILSVRC-2012测试集标签不公开,我们无法报告我们尝试的所有模型的测试错误率。在本段的其余部分中,我们可以互换地使用验证和测试错误率,因为根据我们的经验,它们的差异不超过0.1%(参见表2)。本文描述的CNN实现了top-5错误率为18.2%。平均5个相似CNN的预测给出了16.4%的错误率。训练一个CNN,在最后一个池化层上增加第六个卷积层,对整个ImageNet 2011秋季版本(15M图像,22K类别)进行分类,然后在ILSVRC-2012上对其进行“微调”,错误率为16.6%。对上述5个CNN在整个2011年秋季发布预训练的两个CNN的预测进行平均后,误差率为15.3%。第二好的比赛条目实现了26.2%的错误率,其方法是对从不同类型的密集采样特征计算的FV训练的好几个分类器的预测进行平均。

表2:ILSVRC-2012验证和测试机的错误结果比较。斜体使其他人获得的最佳结果。带有星号*的型号经过“预训练”,可对整个ImageNet 2011秋季版本进行分类。详情请参阅第6节。

最后,我们还报告了2009年秋季版ImageNet的错误率,包括10184个类别和890万个图像。在这个数据集上,我们遵循文献中的惯例,即使用一半图像进行训练,一半进行测试。由于没有确定的测试集,我们的分割必然不同于之前作者使用的分割,但这并不明显影响结果。我们在该数据集上的top-1和top-5错误率分别为67.4%和40.9%,通过上述网络获得,但在最后一个池化层上有一个额外的第六个卷积层。该数据集的最佳公布结果为78.1%和60.9%。

6.1 Qualitative Evaluations(定性评估)

图3显示了网络的两个数据连接层学习的卷积内核。该网络已经学习了各种频率和方向选择性内核,以及各种彩色斑点。请注意两个GPU所展示的特殊化,这是第3.5节中描述的受限连接的结果。GPU1上的内核在很大程度上与颜色无关,GPU2上的内核在很大程度上和颜色有关的。这种特殊化在每次运行期间发生,并且独立于任何特定的随机权重初始化(以GPU的重新编号为模)。

图3:在224\times 224\times 3输入图像上由第一个卷积层学习的96个大小为11\times 11\times 3的卷积核。在GPU1上学习了前48个内核,而在GPU2上学习了最后48个内核。详细信息请参见第6.1节。

在图4的左侧面板中,我们通过计算八个测试图像的top-5预测来定性评估网络学到了什么。请注意,即使偏离中心的对象(例如左上角的螨虫)也可以通过网络识别。大多数top-5标签看似合理。例如,只有其他类型的猫被认为是豹子的合理标签。在某些情况下(格栅,樱桃),对于照片的预期焦点存在真正的模糊性。

图4:(左)8个ILSVRC-2010测试图像和我们模型认为最可能的5个标签。在每个图像下面写入正确的标签,并且还显示分配给正确标签的概率,用红色条(如果碰巧在top-5)。(右)第一栏中的五个ILSVRC-2010测试图像。其余列显示了六个测试图像,这六个测试图像在最后一个隐藏层中产生特征向量,其中距离测试图像的特征向量的欧几里得距离最小。

img img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取