如何提高cifar-10数据集的分类的精度

如何提高cifar-10数据集的分类的准确率

一、问题描述

当我们在处理图像识别或者图像分类或者其他机器学习任务的时候,我们总是迷茫于做出哪些改进能够提升模型的性能(识别率、分类准确率)。。。或者说我们在漫长而苦恼的调参过程中到底调的是哪些参数。。。所以,我花了一部分时间在公开数据集 CIFAR-10 [1] 上进行探索,来总结出一套方法能够快速高效并且有目的性地进行网络训练和参数调整。

CIFAR-10 数据集有 60000 张图片,每张图片均为分辨率为 32*32 的彩色图片(分为 RGB3 个信道)。CIFAR-10 的分类任务是将每张图片分成青蛙、卡车、飞机等 10 个类别中的一个类别。本文主要使用基于卷积神经网络(编码解码器)的方法(CNN)来设计模型,完成分类任务。

首先,为了能够在训练网络的同时能够检测网络的性能,我对数据集进行了训练集 / 测试集的划分。训练集主要用户进行模型训练,测试集主要进行模型性能的评估。因此,我将 60000 个样本的数据集分成了,50000 个样本作为训练集,10000 个样本作为测试集。接下来,我们一步步来分析,如何进行模型设计和改进。

二、搭建最基础的自编码器模型

自编码器结构图示如下:如何提高cifar-10数据集的分类的精度

自编码器详解

对于深度学习的模型,我们一上来肯定是采用最简单的模型,一方面能够快速地 run 一个模型,以了解这个任务的难度,另一方面能够有一个 baseline 版本的模型,利于进行对比实验。所以,我按照以往经验和网友的推荐,设计了以下的模型。

模型的输入数据是网络的输入是一个 4 维 tensor,尺寸为 (batch_size, 32, 32, 3),分别表示一批图片的个数 、图片的宽的像素点个数 32、高的像素点个数 32 和信道个数 3。首先使用多个卷积神经网络层进行图像的特征提取,卷积神经网络层的计算过程如下步骤:

编码部分
**卷积层 1**:卷积核大小 3*3,卷积核移动步长 1,卷积核个数 64,池化大小 2*2,池化步长 2,池化类型为最大池化,激活函数 ReLU。

**卷积层 2**:卷积核大小 3*3,卷积核移动步长 1,卷积核个数 128,池化大小 2*2,池化步长 2,池化类型为最大池化,激活函数 ReLU。

**卷积层 3**:卷积核大小 3*3,卷积核移动步长 1,卷积核个数 256,池化大小 2*2,池化步长 2,池化类型为最大池化,激活函数 ReLU。

编码输出encoded(一维):隐藏层单元数 1024,激活函数 ReLU。
解码输入decoded:维数:4*4*32,激活函数 ReLU。

解码部分
**反卷积层1**:卷积核大小5*5,卷积核移动步长1,卷积核个数32,池化大小2*2,池化步长 2,池化类型为最大池化,激活函数 sigmoid。

**反卷积层2**:卷积核大小5*5,卷积核移动步长1,卷积核个数16,池化大小2*2,池化步长 2,池化类型为最大池化,激活函数 sigmoid。

**反卷积层3**:卷积核大小5*5,卷积核移动步长1,卷积核个数33,池化大小2*2,池化步长 2,池化类型为最大池化,激活函数 sigmoid。

全连接层:神经元个数512,激活函数ReLU
分类层:隐藏层单元数 10,激活函数 softmax。
参数初始化,所有权重矩阵使用 tf.truncated_normal,所有偏置向量使用 
tf.constant(0.01, shape = shape)。损失函数使用 
loss = tf.losses.sparse_softmax_cross_entropy(labels=y,logits=y_),
使用 Adam 梯度下降法进行参数更新,学习率设为固定值 0.001。

该网络是一个有三层卷积层和三层反卷积层的神经网络,卷积层能够快速地完成图像地特征提取。反卷积可以有效的将图像复原,全连接层用于将图像特征整合成分类特征,分类层用于分类。这样,我们最基础版本的 CNN 模型就已经搭建好了,接下来进行训练和测试以观察结果。
训练了20000轮训练精度,损失值,以及测试精度如下:
如何提高cifar-10数据集的分类的精度
结果分析:损失值从一开始的1.54降到了0.11,在整个的训练过程中损失值来回震荡,说明模型不稳定,再看训练精度和测试精度,训练精度有94%而测试精度只有72.8%这明显是过拟合现象。模型不稳定且存在过拟合现象,说明我们的模型需要很大的改进,接下来就进行我们的调参之旅

三、数据增强可以缓解过拟合

数据增强方法总结

有的时候训练集不够多,或者某一类数据较少,或者为了防止过拟合,让模型更加鲁棒性,为了丰富图像训练集,更好的提取图像特征,泛化模型(防止模型过拟合),一般都会对数据图像进行数据增强,
数据增强,常用的方式,就是旋转图像,剪切图像,改变图像色差,扭曲图像特征,改变图像尺寸大小,增强图像噪音(一般使用高斯噪音,盐椒噪音)等.
我使用的图像方法有:

1.**随即反转**:对图像进行左右翻转。

2.**调整光照**:调整图片的亮度

3.**改变对比度**:白色画面(最亮时)下的亮度除以黑色画面(最暗时)下的亮度;

4.**图像标准化**:对图像进行标准化(白化)操作,即将图像本身归一化成 Gaussian(0,1) 
分布。

我将这四种图像增强方法都加入其中,观察其loss值,训练精度和测试精度,训练20000的结果如下:
如何提高cifar-10数据集的分类的精度
结果分析: 我们发现loss的值还是很大,但是相比于基础模型,相对稳定一些,这也是一大进步,再看训练精度和测试精度,训练精度和测试精度之间的差距相对减少,说明图像增强可以有效的缓解过拟合,而且测试精度上升到了将近78%,提升了5%,但我们还是不满意,所以继续优化模型。

四、改进模型

改进模型缓解过拟合的各种方法详解

从模型的角度做出一些优化改进,由于某一个特定问题对某一个模型的改进千变万化,没有办法全部去尝试

1、注意力机制:所谓Attention机制,便是聚焦于局部信息的机制,
让模型更加专注于这一局部信息进行训练,比如,图像中的某一个图像区域。
随着任务的变化,注意力区域往往会发生变化。

2、Dropout:深度学习中最常用的正则化技术是dropout,让一部分的神经元不参加训练,
简而言之就是随机的丢掉一些神经元。这样可以防止过拟合,提高模型的泛化能力。

3、LRN:即局部响应归一化层,LRN函数类似Dropout和数据增强作为relu激活函数之后
防止数据过拟合而提出的一种处理方法。这个函数很少使用,基本上被类似Dropout这样的
方法取代.

4、正则化:对于目标函数加入正则化项,限制权重参数的个数,这是一种防止过拟合的方
法,这个方法其实就是机器学习中的 l2 正则化方法

为了对比试验,实验一只加入了dropout,实验二加入了dropout和LRN,实验三将其全部加入。
训练精度与测试精度结果如下:
实验一:加入了dropout
如何提高cifar-10数据集的分类的精度
实验二:加入了dropout和LRN如何提高cifar-10数据集的分类的精度
实验三:将其全部加入如何提高cifar-10数据集的分类的精度

结果分析:我们观察训练精度与测试精度,随着每一个模型提升的方法,都会使训练集误
差和验证集准确率有所提升
实验一加入了dropout比上一次的测试精度提升了1%,但是训练精度与loss的值上下震荡过
大,说明模型不够稳定,实验二又加入了lrn,测试精度达到了80%提升了2%,虽然训练精
度有的能达到1,但loss的值上下浮动很大不是很稳定,再看实验三,测试精度稍微高出一
点,但可以观察出训练精度以及loss的值相对稳定,说明注意力机制,可以加强模型训练
的稳定性并且能够很大程度地提升模型泛化能力
***[注]由于加入了注意力机制,在训练很少轮的时候模型就能达到最优,所以需要
增加训练轮数,观察精度是否继续提高***

五、增加网络深度

所以,在计算资源足够的情况下,想要获得模型性能的提升,大家最常见打的想法就是增加网络的深度,让深度神经网络来解决问题,但是简单的网络堆叠不一定就能达到很好地效果,抱着深度学习的想法,我做了接下来的实验。

实验一:我将卷积层数扩大到了9层

实验二:在9层卷积的基础上,再将反卷积部分扩大到了6层

实验三:接着我将反卷积加深到7层,并在反卷积部分加入注意力机制

实验一:9层卷积+三层反卷积
如何提高cifar-10数据集的分类的精度

实验二:9层卷积+六层反卷积
如何提高cifar-10数据集的分类的精度

实验三:9层卷积+7层反卷积+注意力机制
如何提高cifar-10数据集的分类的精度

结果分析:
实验二在加深网络层数之后显然可以看出测试精度达到了87%,精度提升了7%,在之
后的加深网络层数的实验中,模型的性能不增反减,测试精度有所下降,这说明如果
网络层数过大,由于梯度衰减的原因,导致网络性能下降,因此,需要使用其他方法
解决梯度衰减问题,使得深度神经网络能够正常 work

六、特征融合(残差网络)

残差网络是提升精度的一大终极武器,2015 年,Microsoft 用残差网络 拿下了当年的 ImageNet,这个残差网络就很好地解决了梯度衰减的问题,使得深度神经网络能够正常 work。由于网络层数加深,误差反传的过程中会使梯度不断地衰减,而通过跨层的直连边,可以使误差在反传的过程中减少衰减,使得深层次的网络可以成功训练。

在这里我使用的是keras模块中封装好的Resnet50网络,将Resnet50训练好的特征与已有模型训练好的特征进行拼接融合,这里的融合主要有两种方法(1.concat,2.add)
在这里我主要使用的是concat方法
实验结果如下图:
如何提高cifar-10数据集的分类的精度

结果分析:
从图中可以看出测试精度比原来的增加了1%

七、总结

对于 CIFAR-10 图像分类问题,我们从最简单的卷积神经网络开始,分类准确率只能达到 73% 左右,通过不断地增加提升模型性能的方法,最终将分类准确里提升到了 87.5% 左右,这 准确率的提升来自于对数据的改进、对模型的改进、对训练过程的改进等,具体每一项提升如下表所示。

改进方法                     测试精度                    提升

基础模型                     72.8%                        0

+数据增强					77.8%						+5%

+模型改进					80.8%						+3%

+模型深度					86.7%						+5.9%

+特征融合					87.5%						+0.9%

其中,数据增强技术使用翻转图像、切割图像、白化图像等方法增加数据量,增加模型的拟合能力。模型改进技术包括 LRN、l2正则化、dropout 等防止过拟合,增加模型的泛化能力。加深网络层数和残差网络技术通过加深模型层数和解决梯度衰减问题,增加模型的拟合能力。这些改进方法的一步步堆叠,一步步递进,使得网络的拟合能力和泛化能力越来越强,最终获得更高的分类准确率。

上一篇:matlab的robotics-toolbox环境配置


下一篇:GDB调试工具入门