DenseNet Models for Tiny ImageNet Classification(翻译)

PS:个人学习记录;有问题请留言,看到会回复!谢谢!


原文地址:https://arxiv.org/pdf/1904.10429

 :本文提出了两种基于微型ImageNet数据集的图像分类模型。我们基于密接卷积网络的思想从无到有地建立了两个截然不同的网络。根据该数据集的图像分辨率,通过计算卷积层的接收场,设计了网络结构。我们还使用了一些与图像增强和循环学习率相关的非常规技术来提高模型的准确性。该网络在高约束和低计算资源下训练。我们的目标是达到60%的前1验证精度,并给出了结果和误差分析。

1. 引言

图像分类竞赛有很多,如ImageNet大规模视觉识别挑战赛(ILSVRC),其中提出了几种卷积神经网络结构和模型。2015年,ResNet模型以152层赢得了ImageNet[1]挑战,获得了3.57%的Top 5分类误差[2]。在本文中,我们提出了一种为ImageNet数据集的子集(称为Tiny ImageNet)建立分类模型的方法。我们没有使用任何可用于原始ImageNet挑战的预训练网络。相反,我们从头开始构建了两个不同的模型,从DenseNet架构中获得灵感[3]。我们的目标是达到60%的验证精度与这些自定义模型在几个限制和有限的资源。我们最大的挑战是Google Colab[5]免费服务提供的低计算能力。Google Colab只提供12小时的连续计算时间,之后需要重新连接会话。此外,我们还限制了我们的模型使用任何密集或完全连接的层、任何丢失层、1x1滤波器来增加通道数和超过500个训练批次。为了提高精度和减少计算时间,我们使用了一些针对这一挑战的创新技术。

2. 数据集

微型ImageNet数据集[4]是原始ImageNet数据集[1]的修改子集。这里,有200个不同的类,而不是1000个类的ImageNet数据集,有100000个训练示例和10000个验证示例。图像的分辨率只有64x64像素,这使得从中提取信息更具挑战性。从图像上看,人眼很难在某些图像中检测到物体。

3. DenseNet

我们使用DenseNet[3]的概念来设计我们的模型架构。深度神经网络的主要挑战是梯度消失问题。这个问题首先通过引入剩余网络来解决,剩余网络使用一个快捷连接将输入从一个块传递到另一个块。与ResNet不同,DenseNet没有通过求和聚合特征;相反,它们是通过连接来组合的。因此,信息从一层传递到所有后续层,以确保信息和梯度在整个网络中更好地流动。

 

4. 方法

 

图2 DenseNet网络体系结构

4.1 感受野

对于我们两个网络,我们通过首先计算接收场来实现模型中的层数[6]。在我们的模型中,我们使用了(3x3)的卷积核和步长为(1,1)的内核。因此,对于第一层,当每个核一次卷积超过(3x3)像素或9像素时,接收场为(3x3)。每一个这样的卷积运算都会使矩阵的空间维数减少2,从而使网络的接收场增加2。而在MaxPooling层,矩阵的空间维数减少了一半,从而使整个感受野加倍。网络的接收场计算如图3所示:

 

                                                                                          图3网络感受野

当我们到达原始图像大小为64x64的接收场时,我们希望我们的模型能够清晰地检测出每个图像中的对象,并能够对它们进行分类。然而,更进一步使得一个接收场超过原来图像大小的两倍,使网络也能学习更多背景细节。由于背景控制,我们的数据集中的许多图像令人困惑,因此对于这些图像,我们希望我们的模型能够理解我们的对象所在的上下文。

 

                                                                                            图4牛蛙图片

例如,在图4所示的牛蛙类中,我们可以观察到,除了我们的对象(即牛蛙)之外,大多数图像都具有绿色背景。我们希望我们的网络除了学习我们的对象之外,还学习这一点。

4.2 模型设计

一开始,我们不费吹灰之力就分别实现了普通的ResNet-34和ResNet-50模型作为我们的网络1和网络2。对于ResNet-34,我们在训练集和验证集上分别获得了99.8%和33.5%的准确率,批处理大小为500个图像,运行100个阶段。对于ResNet-50,我们在两个训练集上获得了49%的准确率,在验证集上获得了26.2%的准确率,批处理大小为512个图像,运行50个批次。尽管这显示了ResNet模型的学习能力,但我们注意到,由于在浅层数据集上使用了深网络,验证精度早就饱和了[7]。

基于斯坦福231n课程项目报告[8]中解释的方法,我们考虑了一种构建定制DenseNet模型的改进方法,其设计元素为ResNet-18。该方法背后的适当原因可以从这样一个事实确定:对于64x64图像上的深网络,问题出现在最初几层之后,它开始作为大小为1x1的标识图工作,每增加一层就可以忽略不计。所以我们选择一个大约15个卷积层的浅层网络,在输出之前,它的宽度足以容纳大约1000个信道。

对于网络1

(1)我们构建了一个由3个“瓶颈”块组成的定制体系结构,每个块的末尾有5个增加通道的卷积层和1个最大池层。

(2)在应用连接之前,我们将每个块的输出馈送到space_to_depth函数。此函数确保连接前两层的空间维度相等。

(3)我们将每个块输出的跳过连接与下一个块的输出连接起来,在将两个块的信息输入到下一个块之前保留它们。

(4)模型的最后一层是1x1卷积层,后面是一个全局平均池层,它平均任何大小矩阵的空间维度。这一层使我们能够设计一个模型,它可以接受任何大小的输入图像。我们将利用这一事实来更好地训练我们的模型(将在图像增强中进一步说明)。

对于网络2,我们修改了ResNet-18架构,如下所示:

(1)我们将最初由64(7x7)个带步长(2,2)的滤波器组成的第一个卷积层替换为32(3x3)个带步长(1,1)的滤波器,并删除了最大池层。

(2)我们移除了由4个64(3x3)滤波器卷积层组成的第一个块。

(3)我们在每2个卷积层之后移除跳跃连接,而不是在4个卷积层之后继续保留。我们在快捷方式中将原来的add函数替换为串联,这样它就保留了前一个块中的通道,而不合并它们。我们在每个快捷方式之后添加了一个批量规范化和ReLU激活层。

(4)根据项目的需要,我们用1x1卷积层替换了最终的FC层,以将信道数减少到所需的类数,然后是Global Average Pooling层。

​​​​​​​4.3 图像增强

为了人为地增加训练数据量,避免过度拟合,我们依赖于图像增强。

对于网络1,我们使用直接和间接方法来实现图像增强。首先,作为一种间接的方法,我们为最初的几个时期提供32x32分辨率的图像,然后是64x64分辨率的图像。然后我们为接下来的几个时期提供分辨率为16x16的图像,最后为模型提供分辨率为64x64的图像。这背后的原因是将低信息量的扩展数据输入到模型中,直到验证精度达到饱和,这样它就可以从这些图像中学习一些特征。这项技术使我们的验证准确率提高了3-4%。

在50%的验证精度下,我们直接应用了来自imgaug库的图像增强[11]。我们手动提供参数的范围,并从每个图像的列表中随机选择增强项(从0到全部)。我们使用了以下增强:

  • •Scale  
  • •Coarse Dropout
  • •Rotate
  • •Additive Gaussian Noise
  • •Crop and Pad

应用这一方法,我们得到了9.5%的验证准确率后,再运行150个阶段。

对于Network 2,在整个运行过程中,我们保持默认的64x64图像分辨率作为输入大小。我们没有像网络1那样在经过一定次数的迭代后应用图像增强,而是使用imgaug库[11]从模型运行开始,将11个变换的随机序列[8]应用到数据集的一半。每个变换的强度在指定的范围内随机确定,但这些范围参数是手动提供的,以便这些变换后的训练图像能够在验证数据集中紧密地表示图像。应用的增强是:

  • •Horizontal Flip
  • •Vertical Flip
  • •Gaussian Blur
  • •Crop and Pad
  • •Scale
  • •Translate
  • •Rotate
  • •Shear
  • •Coarse Dropout
  • •Multiply
  • •Contrast Normalisation

​​​​​​​4.4 正则化、优化器、超参数和回调

批处理规范化有助于在每个批处理中使前一层的输入正常化,使值保持在平均值等于0、标准偏差等于1的可比较范围内。这确保了我们模型的激活不会在任何一个特定的点上发生倾斜,同时也提高了计算速度。对于这两个网络,我们在每个卷积后应用了批处理规范化。然后将这些值传递给ReLU激活函数。我们用准确度作为度量,用分类交叉熵作为损失函数。

对于Network 1,我们选择了默认学习率为1e-3的默认Adam优化器,它给了我们很好的结果,但每个批次都在波动。我们没有使用任何内核正则化器,也没有更改此网络的内核初始值设定项的默认值。我们使用ReduceLRonPlateau作为回调函数,在验证损失停滞5个批次时降低学习率。

对于网络2,我们对每个卷积层使用lambda值为2e-4[8]的L2核正则化器和方差缩放核初始值设定项[8]。我们使用Adam优化器,学习率为1e-4,epsilon值为1e-8。我们没有像网络1那样在高原期间降低学习率,而是使用循环学习率方法[12],在特定迭代次数的值范围内改变学习率。这种技术有助于我们在更少的时间段内获得更好的验证精度。我们使用三角形2比率策略,在每个周期中将最大学习比率减半。作为对原文献[12]提出的一个修正,在一定的循环次数之后,直到最后,我们并没有逐渐减小循环和步长的范围值。相反,对于验证精度没有显示出比前一个范围任何增加的周期,我们增加这些周期的学习率范围,然后降低下一个周期的学习率范围。在这里,对于学习率范围从1e-7到6e-7的循环,在范围从1e-6到6e-6的循环之后,我们没有看到验证准确性的提高,因此我们增加了这些循环的学习率范围从1e-5到6e-5,然后减少了下一个循环的范围从1e-7到6e-7。这使我们的验证准确率提高了0.3%。

下表1总结了这一点。

 

由于Google Colab[5]笔记本电脑的连续使用时间限制为12小时,因此对于两次模型运行,我们都使用了一个模型检查点来以最佳的验证精度保存模型,因为我们必须为每个网络运行100多个批次。

5. 实验结果

对于网络1,我们使用1790万个参数对235个批次进行了模型训练,32x32和16x16分辨率图像的批处理大小为256,64x64分辨率图像的批处理大小为64。首先,我们对15个批次的32x32分辨率的训练图像进行了测试,验证准确率达到25%。此时,模型已经开始过拟合,所以我们切换到64x64分辨率的图像和运行了30个批次,验证准确率提高到48%。为了在低分辨率图像上训练该模型并模拟放大,我们在16×16分辨率图像上仅训练了10个批次。我们在这里保持较低的时期,因为虽然我们希望模型从低信息图像中学习,但我们也希望避免过度拟合。我们改回64x64分辨率的图像,并坚持到它的其余训练。在运行了30多个批次之后,我们的验证精度达到了48-49%左右,现在我们实现了图像增强。我们对每幅图像进行了一些增强,并将我们的模型运行了150个批次。由于多次增强,现在模型训练得慢得多,但尚未开始过度拟合。训练和验证准确率之间的差距仍然很小,我们对其进行了训练,直到验证准确率饱和到59%左右。在这里,训练精度达到67%,所以我们没有进一步训练,以避免过度拟合。我们使用模型检查点从培训中选择了最佳模型,在验证数据集上的准确率为59.5%。

 

                                                                                    图6 网络1的损失曲线

对于Network 2,我们使用1180万个参数对108个批次(批量大小为128张图像)的模型进行了训练。如图7所示,周期性学习率帮助我们提前获得更高的验证精度,大大降低了验证损失。我们还清楚地看到,在70个批次之后,我们的验证损失几乎达到了10个批次的平稳水平。当我们应用更高的周期学习率范围时,损失突然增加是显而易见的,之后,虽然训练精度继续下降,但验证精度达到了一个新的平台。在108个批次结束时,我们获得了62.73%的验证准确率,而我们的训练准确率保持在68.11%,再次表明差距很小。

 

                                                                                    图7 网络2的损失曲线

这两个网络的验证精度均高于浅层ConvNets[7]和ResNet-18(无Dropout)模型[9],并且非常接近最先进的ResNet-18(具有多种Dropout技术)模型[10]。

6. 错误分析

我们将最后一个模型所犯的Top 1个错误的一些有趣的例子可视化,如图8所示。

 

                                                                                   图8错误标记类的示例

总的来说,这些错误通常是由于三个主要原因造成的[8]:图像分辨率低、对图像中主要实体的误解以及类似项目的混淆。通过对正确和错误分类图像的手动检查,我们可以得出以下详细结论:

在正确分类的图像中,我们观察到物体和背景之间有明显的区别。每一个最佳分类类别的图像往往在其内部共享相同的特征,如颜色、纹理等。此外,该模型在检测覆盖整个64x64分辨率且具有最小背景的对象时表现得非常好。尽管对于“flagpole”、“flagstaff”等类,该模型能够检测放大和缩小的对象。这可能是因为我们提供了低分辨率图像,并使用了缩放增强。

在分类错误的图像中,由于图像分辨率低,许多图像被错误分类。其中有些甚至很难被人类区分开来。例如,一只“埃及猫”被误分类为“虎斑猫”,或者一只“拉布拉多猎犬”被误分类为“黄金猎犬”。在这里,由于图像中的细节不多,考虑到64x64的低分辨率,模型可以检测出物体的类型(如狗),但无法进一步将其细分为正确的类(如拉布拉多寻回犬和金毛寻回犬)。

另一类分类错误的图像是由于对图像意图的误解[8]。这盘水果被归类为“香蕉”,仅仅是因为里面确实有香蕉;然而,真正的标签是“橙色”。一盘本来被归类为“肉卷”的食物,却被归类为“盘”,这是完全合理的。这种错误是不可能改正的。一个图像中通常有多个实体;我们的网络正确地解释了这些图像,但没有解释真正正确的内容。

最后一种误分类图像是由于类别之间的距离太近,有时甚至存在一些重叠。“敞篷车”被错误地归类为“跑车”,但实际上,很大一部分“敞篷车”也是“跑车”。

综上所述,虽然近30%的图像没有被正确分类,但大量的错误是合理的,有些甚至是可以原谅的。表2显示了按我们的网络划分的最差类别:

 

在分析我们的预测之后,我们将正确和错误标记的图像分开,并将错误标记的图像过采样三倍于正确标记的图像。我们还尝试了另一种方法,对低精度类进行软加权。我们希望我们的模型能够更好地利用这些技术来学习错误分类的图像;然而,我们的模型开始过度拟合,我们观察到验证精度没有提高。

7. 总结

我们试图在非常高的约束条件和稀缺的计算资源下克服微型ImageNet数据集的挑战。通过设计两个非常适合挑战的定制DenseNet模型,我们的网络能够以59.5%和62.7%的前1名准确率取得很好的结果。我们使我们的模型尽可能宽,而不是太浅,以提取最大的特征,并防止过度拟合我们的64分辨率图像。我们对两个模型都使用了几种数据增强技术来提高验证的准确性。为了从图像中提取更多的信息,我们使用了一些很有前途的技术,例如输入图像的不同分辨率,以及提供不同范围的循环学习速率范围。实施这两种技术后,我们观察到,在几个周期内,它可能会对训练产生短期负面影响,但从验证准确性的跃升中明显地显示出长期有益的影响。我们将通过在其他开放数据集上应用这些技术来进一步努力。最后,我们对最终模型产生的误分类图像进行了人工检验,获得了有价值的见解。为了进一步的研究,我们将根据所获得的见解,通过定制图像增强参数来微调我们的模型。我们还将关注网络的架构,并致力于实现更高的精度。


参考文献

[1] http://www.image-net.org/.

[2] K. He, X. Zhang, S. Ren, J. Sun, Deep Residual Learning for Image Recognition,

arXiv:1512.03385v1, 2015

[3] G. Huang, Z. Liu, L. v. d. Maaten, K. Q. Weinberger, Densely Connected Convolutional Networks, arXiv:1608.06993v5, 2018

[4] https://tiny-imagenet.herokuapp.com/

[5] https://colab.research.google.com/

[6] H. Le, A. Borji, What are the Receptive, Effective Receptive, and Projective Fields of Neurons in Convolutional Neural Networks?, arXiv:1705.07049v2, 2018

[7] S. H. S. Basha, S R Dubey, V Pulabaigari, S Mukherjee, Impact of Fully Connected Layers on Performance of Convolutional Neural Networks for Image Classification , arXiv:1902.02771v2, 2019

[8] http://cs231n.stanford.edu/reports/2017/pdfs/ [pdfs: 12 & 930]

[9] M. S. Ebrahimi, H. K. Abadi, Study of Residual Networks for Image Recognition, arXiv:1805.00325v1, 2018

[10] R. Keshari, R. Singh, M. V atsa, Guided Dropout, arXiv:1812.03965v1, 2018

[11] https://github.com/aleju/imgaug

[12] L. N. Smith, Cyclical Learning Rates for Train Neural Networks , arXiv:1506.01186v6, 2017

[13] https://in.linkedin.com/in/rohanshravan


参考代码:https://github.com/ZohebAbai/Tiny-ImageNet-Challenge

因为原码是在Google colab上运行的,并且tensorflow的版本要求也不同!下面附上我自己在源码上的修改:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章