简单分类模型设计与实现

摘要:本Task通过训练DenseNet网络结构,对具有100个标签值的CIFAR-100图像分类数据集进行分类。DenseNet作为一种强大的CNN分类模型可以训练出更深的网络结构,得益于其密集连接可以有效地避免梯度消失问题。同时为了防止过拟合,对输入图片进行随意位置的剪裁、一定概率的水平翻转和一定角度旋转,并设置了权重衰减。出于模型的稳定性和收敛速度的考虑,在模型训练初期设置了warmup阶段,采用学习率衰减策略。实验结果表明,在batch size为128,经过200个epoch的训练后,其在测试集上的分类准确度达到了79.23%,因此可以看出DenseNet相比于传统的网络结构,具有更强的特征提取能力。实验采用了TensorboardX对训练和验证阶段的模型性能及参数进行了可视化,以更好地分析模型的学习过程。

关键词:图像分类;DenseNet;迁移学习;AlexNet;CIFAR100;TensorboardX

1 数据集介绍

CIFAR-100中的100个类被分成20个超类。每个图像都带有一个“精细”标签(它所属的类)和一个“粗糙”标签(它所属的超类)。数据集分为五个训练批次和一个测试批次,每个批次有10000个图像。测试批次包含来自每个类别的恰好1000个随机选择的图像。训练批次以随机顺序包含剩余图像,但一些训练批次可能包含来自一个类别的图像比另一个更多。总体来说,五个训练集之和包含来自每个类的正好5000张图像。

数据为一个10000x3072 uint8的numpy数组。阵列的每一行存储32x32彩色图像即每一行存储32x3 x 32=3072个数字信息。前1024个条目包含红色通道值,下一个1024个绿色,最后1024个蓝色。图像以行优先顺序存储,以便数组的前32个条目是图像第一行的红色通道。
标签为范围是0~9的10000个数字的列表。索引i处的数字表示阵列数据中第i个图像的标签。

该数据集包含另一个名为batches.meta的文件。它也包含一个Python字典对象。它有以下条目:label_names为一个100个元素的列表,它为上述标签数组中的数字标签赋予了有意义的名称。例如,label_names [0] ==“飞机”,label_names [1] ==“汽车”等

2 网络结构选择

本分类任务最终选择DenseNet模型,DenseNet相比于传统的网络结构可以训练出更深的CNN模型,从而实现更高的准确度。DenseNet的核心是建立前面所有层与后面层的密集连接,这有助于训练过程中梯度的反向传播,从而能训练出更深的CNN网络。DenseNet的另一大特色是通过特征在channel上的连接来实现特征重用。这些特点让DenseNet在参数和计算成本更少的情形下实现更优的性能。

在DenseNet中,会连接前面所有层作为输入:

 其中,上面的代表是非线性转化函数,它是一个组合操作,其可能包括一系列的BN,ReLU,Pooling及Conv操作。注意这里l层与l-1层之间可能实际上包含多个卷积层。

 

DenseNet的密集连接方式需要特征图大小保持一致。为了解决这个问题,DenseNet网络中使用DenseBlock+Transition的结构,其中DenseBlock是包含很多层的模块,每个层的特征图大小相同,层与层之间采用密集连接方式。而Transition模块是连接两个相邻的DenseBlock,并且通过Pooling使特征图大小降低。

DenseBlock中各个层卷积之后均输出k个特征图,即得到的特征图的channel数为k,或者说采用k个卷积核。k在DenseNet称为growth rate,这是一个超参数。一般情况下使用较小的k(比如12),就可以得到较佳的性能。

由于后面层的输入会非常大,DenseBlock内部可以采用bottleneck层来减少计算量,主要是原有的结构中增加1x1 Conv,即BN+ReLU+1x1 Conv+BN+ReLU+3x3 Conv,称为DenseNet-B结构。其中1x1 Conv得到4k个特征图它起到的作用是降低特征数量,从而提升计算效率。

对于Transition层,它主要是连接两个相邻的DenseBlock,并且降低特征图大小。Transition层包括一个1x1的卷积和2x2的AvgPooling,结构为BN+ReLU+1x1 Conv+2x2 AvgPooling。另外,Transition层可以起到压缩模型的作用。假定Transition的上接DenseBlock得到的特征图channels数为m,Transition层可以产生theta*m个特征(通过卷积层),其中theta是压缩系数。当theta=1时,特征个数经过Transition层没有变化,即无压缩,而当压缩系数小于1时,这种结构称为DenseNet-C。对于使用bottleneck层的DenseBlock结构和压缩系数小于1的Transition组合结构称为DenseNet-BC,本次实验使用的就是DenseNet-BC。

本次分类任务使用的是DenseNet121,即121层(含参层)的DenseNet网络结构。其由4个DenseBlock,3个Transition,7x7 Conv(第一层)和线性分类层(最后一层)构成。其中4个DenseBlock分别包含6、12、24、16个1x1 Conv和3x3 Conv的卷积组合, 每个Transition包含一个1x1 Conv。growth rate选为32。

3模型配置与超参数选择

针对此分类问题,采用交叉熵作为损失函数,随机梯度下降法(SGD)作为优化器。

实验时的超参数设置参考《Improved Regularization of Convolutional Neural Networks with Cutout》,其中权重的衰减一定程度上避免了模型的过拟合。具体超参数选择见表1。

表1 超参数选择

超参数

epoch

200

batch size

128

数据加载器的工作线程数

2

growth rate

32

初始学习率

0.1

学习率衰减

0.2

warmup阶段的epoch数

1

动量

0.9

权重衰减

5e-4

表2 随epoch变化的学习率

epoch

learning rate

1

0~0.1(warmup阶段)

2~59

0.1

60~119

0.02

120~159

0.004

160~199

0.0008

为了提高学习速度并防止震荡,分别在第60、120、160个epoch对初始学习率进行衰减。同时为了防止模型的不稳定,在第1个epoch采用warmup预热学习率方式,待模型趋于稳定后,再将学习率设置为初始学习率进行训练以获得更快的收敛速度。各epoch的学习率见表2

4 实验

    本次分类任务训练并测试了两种网络结构:AlexNet和DenseNet。测试集上的准确度表明DenseNet的分类效果更好。下面的图1、图2和图3是由Tensorboard绘制的DenseNet性能表现。随着loss值的减小和准确度的提升可以看到网络确实从数据集中学到了相关特征。

简单分类模型设计与实现_第1张图片

图1 训练阶段每个batch的损失值

简单分类模型设计与实现_第2张图片

图2 验证阶段每个epoch的平均损失值

简单分类模型设计与实现_第3张图片

 图3 验证阶段每个epoch的准确率

图4和图5分别为训练过程中模型最后一层权重和偏置梯度的2范数随epoch的变化、可以看到权重和偏置的梯度在减小,但不为0。

简单分类模型设计与实现_第4张图片

 图4 最后一层权重梯度的2范数随epoch的变化

简单分类模型设计与实现_第5张图片

 图5 最后一层偏置梯度的2范数随epoch的变化

训练阶段每10个epoch对模型参数进行一次常规保存,在120个epoch以后保存每一次准确度出现新高的模型参数。在测试阶段,下载验证集上准确度最高的一次模型参数进相应的模型,进行测试。

对于DenseNet训练训练较慢的问题,我还尝试了torchversion提供的预训练模型。实验结果表明,带有预训练参数的模型确实收敛速度更快,但其准确度却略低于随机初始化参数的DenseNet模型。表4给出了各训练模型在测试集上的性能表现。

表3 各训练模型的性能比较

模型

Top 1 error

Top 5 error

参数量(个)

AlexNet

0.4309

0.1876

20495268

DenseNet

0.2077

0.0513

7048548

DenseNet预训练

0.3895

0.1474

7056356

    实验初期,对于AlexNet模型,采用不同的模型配置(如不同的优化函数),以及是否采用学习率衰减和warmup阶段,得到测试集准确度也是不一样的。由此可见,训练时超参数的选择和模型配置对于网络结构的最终性能也是十分关键的。

5 感想

分类问题作为深度学习中一个较为基本的问题,已经得到了广泛的研究。CIFAR作为一个较为典型的数据集,也被很多分类模型使用过,这些网络结构在分类准确度、参数规模、内存消耗、训练时间等指标上有着各自的优点。

通过本Task的学习,我认识到在面对具体分类任务时,首先要观察数据集的规模等特征,选用合适的网络结构,一个优秀的网络结构对问题的解决是至关重要的。因此我也非常期待每一个新网络结构的提出,并希望自己有机会参与其中。当然数据集的制作、预处理、扩充,以及一些超参数的选择、训练策略的使用、损失函数与优化函数的选取等对模型的过拟合,梯度消失等问题都有影响,都会决定模型最终的性能。

你可能感兴趣的:(机器学习,python,深度学习)