图像分类中的tricks分享

图像分类中的tricks分享

前言:前不久,应导师的要求,给学弟学妹们讲解一下图像分类任务训练模型的技巧,哇,一听我就急了,这我哪会啊,奈何也不能反抗,于是搜了一星期的资料,做了个非常简陋的PPT和讲稿就上阵了。现在贴在这里,才疏学浅,有什么错误的地方,欢迎各位大佬指正。之后随着我更多的具体实践,可能会继续补充这篇文章,谢谢各位的补充和支持。

我记得我之前做过的关于图像分类的实验有手写数字识别、Cifar-10数据集识别、各种服装物品的一个数据集、猫狗识别、手势识别等。一般来说呢,我们去进行这些图像分类的实验呢,是为了得到更好地分类准确率。所以针对图像分类任务,提升准确率的方法路线一般有两条:1、网络的修改 2、数据处理和训练的技巧,就是业界俗称的tricks。
在这里插入图片描述
我们在接触机器学习的时候,会学习一些比较传统的机器学习方法,比如KNN、SVM、MLP等,这些传统的机器学习方法在比较简单的分类或者预测问题上会有不错的效果,但是呢将他们应用到图像分类问题上,最后的效果会有些不足,所以我们现在都使用深度学习的方法进行图像分类。

这是因为传统机器学习方法的效果过度依赖于特征,而传统机器学习的方法是由手工提取特征,具有较大的局限性,因此无法胜任一些复杂的任务。而深度学习的方法通过深层的网络结构将特征提取的任务和分类器整合到同一个网络中,通过反向传播机制不断更新模型参数,从而更好地提升模型的特征提取和分类的能力。(此处引用了知乎博主初类的部分解释)

这里罗列了一些深度学习得方法,是按提出的时间排列的,现在使用较多的就是Resnet系列,就是我们所说的残差网络。
在这里插入图片描述
在传统机器学习方法中,训练的技巧主要是对一些参数的调节,比如在KNN中的k的取值,距离计算函数的选择,SVM中核函数的选择,学习率的定义,MLP里面神经元的层数以及数量等超参数的调节,这个可以在具体的任务中进行相应调节和自行尝试,今天我主要来介绍深度学习中的一些方法:

我们在拿到一个数据集的时候呢,首先呢要对数据集进行数据集分析,这应该是毋庸置疑的,数据集分析的作用是了解这个数据集中的图像质量、类别分布情况等,再进行进一步的图像预处理操作,图像预处理操作是为了增强图像的质量,进一步提升在网络中的特征提取效果,比较常用的方法就是图像均衡化、降噪、几何变换等。

接着,在送入网络前,我们要选择合适的分辨率,一般来说,图片越大,其纹理和上下文就越多,越能捕捉到更好的特征,但是,当尺寸变大到一定程度,分类性能可能反而会不变,甚至变坏;当尺寸变大时,计算的开销也会相应的变大很多,所以需要进行一定的平衡。我之前在做猫狗图像分类的时候,是用resnet18做的,然后在原有图像的分辨率中做了尺寸缩放,但是最后的准确率好像只有七八十,但是我将图像的分辨率进行放大后,准确率涨了十几个点到了百分之90几,但是训练的时间也变得更长。
在这里插入图片描述
其次就是数据集的划分, 数据集的划分一般是按照7 :3来划分训练数据和测试数据,不过你也可以在训练前使用其他比例进行划分,最后的准确率会稍微受到影响,按照西瓜书上的描述是将大约 2/3 ~ 4/5 的样本数据用于训练,剩余样本用于测试。

接下来是网络超参数的设置部分,神经网络的超参数主要分为2种

第一种是和网络结构相关,包括网络中间层数量、类型、每层神经元数量、激活函数等
第二种就是模型训练相关,包括损失函数、优化方法、批次大小、迭代次数、学习率等。

一般我们都使用现有的深度学习算法,所以网络结构方面会比较少去修改,我们主要来说一下模型训练相关的超参数设置。

第一个关键的超参数就是模型学习率,一个理想的学习率会促进模型收敛,而不理想的学习率甚至会导致模型直接损失函数损失值爆炸无法完成训练。一般来说,模型训练开始时初始学习率不宜过大,以0.01, 0.001为宜。当然,最好的方法就是直接使某一个网络论文中提到的学习率,都是经过很多的实验验证的。

第二个就是损失函数,一般我们会选择交叉熵函数,现在呢,其实也出现了很多种其他的损失函数,有兴趣可以去了解一下。

第三个就是优化函数的选择,卷积神经网络通常采用随机梯度下降类型的优化算法,比较常用的优化算法有SGD、SGDM、Adam等。

第四个就是batch size的设定,也就是批次大小,batch size一般要调大一点,但也不是越大越好,这个参数的设置往往与学习率有关系,需要与学习率进行动态调整,不过这个参数往往会受到显卡性能的影响。我之前在复现论文中的算法时,也尝试将迭代次数稍微增大一些,能够得到比论文中好一点的指标,所以我们在训练图像分类模型的时候,可以尝试对批次大小进行多次调节。
在这里插入图片描述
我们在训练一个图像分类的模型的时候,如果你从头开始训练,一般来说损失会很大并且会消耗大量的训练时间。在小数据集上,我们可以尝试使用预训练模型,比如基于几百万张的imagenet-1k数据训练出来的预训练模型,这样往往可以提升特定任务的精度。

第二个方法就是加入正则化。正则化,就是在原来的loss function的基础上,加上了一些正则化项或者称为模型复杂度惩罚项,它能够提高模型的泛化性能、减少过拟合。常用的正则化方法有:label_smoothing,就是标签平滑,我等一下会具体介绍一下、dropout就是让一部分的神经元不参加训练,简而言之就是随机的丢掉一些神经元、当然还有L1/L2正则化、LRN等。其实图像增强也是一种正则化方法,因为本质上也是为了提高模型的泛化能力,等一下我会具体介绍一下。

第三种不错的方法就是特征或者模型融合,特征融合就是使用不同的网络结构进行特征的提取,最后使用add或者concat的方法进行融合,目的是为了能提取更多的特征。模型融合一般指预测结果的融合,可以使用多个模型对同一个数据集进行训练与预测,最后按照一定的方式对预测结果进行合并。我们在之前做的文本识别就使用了这个方法,用resnet101和resnext分别训练,最后根据置信度进行结果的融合,最后指标有了提升。
在这里插入图片描述

接下来我来介绍一下标签平滑。在我们传统的图像分类中,以猫狗二分类为例,1代表狗,0代表猫,我们的预测结果要不是0,要不就是1,是个二值问题,在实际训练中,分类器会对预测结果变得“过于自信”,这可能会降低它们的泛化能力。简单来说就是,当预测结果为1,标签也1,这样是正确的,但是在一些数据集上通常会包含标签错误的数据,所以我们需要神经网络对标签这些所谓的正确答案持怀疑态度,以减少一定程度上神经网络围绕错误答案进行特征建模的可能。所以在预测中,0.1 的标签平滑意味着目标答案将是 90%确信这是一个狗的图像,而 10%确信这是一只猫,而不是先前的一定是1 或 0 结果。由于不太确定,所以提高了它对新数据的预测能力。这是标签平滑方法的公式,还是比较好理解的。
在这里插入图片描述
最后还有一种最有效的方法,我放到了最后介绍,就是图像增强。这里是其中一部分的图像增强方法的示意图。常用的方式:旋转图像,剪切图像,改变图像色差,扭曲图像特征,改变图像尺寸大小,增强图像噪音(一般使用高斯噪音,盐椒噪音)。不同的图像增强有着不同的作用,比如旋转和裁剪能够降低目标的位置对特征建模的影响,对图像进行图像增强能够降低目标颜色对特征建模的影响等。图像增强方法主要用于样本过少的数据集或者类别不均衡数据集的增广,同时也能增加网络的泛化能力。还有一些其他的图像增强方法,比如进行随机遮挡,多个图像进行裁剪合并等。在实际操作中,图像增强方法能比较大幅得提升分类的准确率。
在这里插入图片描述
当然还有其他一些优化的方法,比如学习率衰减策略、更换损失函数、注意力机制、迁移学习、知识蒸馏等,大家可以去找论文进行了解和学习一下。

才疏学浅,有什么错误的地方,欢迎各位大佬指正。之后随着我更多的具体实践,可能会继续补充这篇文章,谢谢各位的补充和支持。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值