目录
本文介绍了一种使用ResNet-152模型,以道路坑洼检测为例进行图像分类问题的处理。
考虑到数据集中的样本不够多,使用数据增强来增加数据集的多样性。比如,我们可以对每一张图片进行旋转、缩放、翻转等操作,来创造出新的图片,这样就可以在原有的数据集上增加更多的信息,帮助模型更好地学习。
在卷积网络学习过程中,为减少梯度消失或者梯度爆炸的可能性,采用ResNet残差网络。
在训练过程中,模型开始时可能需要较大的学习率来快速优化参数,但随着训练的进行,逐渐减小学习率可以让模型更加细致地调整参数,达到更好的效果。于是采用学习率衰减策略对参数调优。
对与少量的数据集采用根据有说服力的迁移学习,采取卷积层迁移学习,全连接层使用交叉熵处理分类问题的方式,最终达到预测效果。考虑到实际情况,针对对未来处理数据量的不同,分别使用152层、50层和18层的不同训练次数进行AUC和准确率比较,最后选择更适合的模型进行预测集进行预测。
1.1数据规格统一化
对所有训练集和测试集的格式大小进行统一规格化224 x 224格式。
1.2数据前处理归一化
对图像数据进行正则化处理,使用正则化约束模型的均值和标准差参数来降低模型的复杂度,加快收敛速度来防止过拟合。注意到训练集较少的数量,少量的训练集来预测大量的图像数据,往往会出现很大的测试误差和准确率下降等问题。,于是选取imagenet数据集的均值参数集[0.485,0.456,0.406]和标准差参数集[0.229,0.224,0.225],因为imagenet数据集是在上百万张图像上计算所得出的结果,具有公认的代表性。
1.3.数据增强
数据增强的主要目标是提高模型的泛化能力和鲁棒性,由于训练数据量比较少,可以通过数据增强来增加训练数据量来提高泛化能力。
会对数据图进行随机旋转、翻转、放大、缩放、裁剪、颜色扰动(随机调整图像亮度、对比度、饱和度、色相属性)、概率转灰度图等方法形成新的数据图。
二、卷积层和全连接参数的选取
2.1迁移学习
采用迁移学习,即冻结卷积层,卷积层默认使用Pytorch已经训练好的权重和偏置参数进行初始化。全连接层则需要进行残差网络resnet进行训练。
2.2 epoch轮次调整
数据量少时,设置较小的epoch数量可以减少模型训练的时间和计算资源。这是因为epoch是指数据集通过模型的次数,当数据集较少时,我们可以通过减少epoch数量来减少模型训练的次数。
在卷积神经网络学习中,epoch是模型训练的重要参数之一。每次epoch,模型会使用整个数据集进行一次前向传播(将数据输入模型)和一次反向传播(计算损失并更新模型参数)。因此,当数据集较小时,如果设置较大的epoch数量,会导致模型训练次数过多,进而导致训练时间和计算资源的浪费。
此外,当数据集较小时,模型可能会过拟合,即过度适应训练数据而无法泛化到新的测试数据。设置较小的epoch数量可以减少模型对训练数据的过度适应,从而降低过拟合的风险。
需要注意的是,如果数据集过小,可能会无法充分地训练模型,导致模型的效果不佳。因此,在设置epoch数量时,需要根据数据集的大小和模型的实际需求进行调整。
三、模型选择
图1:欠拟合与过拟合
图2:模拟退化
在卷积神经网络学习过程中,更希望随着层数增加而增强学习特征的准确度。如图1显示,在具体的实验过程中,20层普通的深度学习之上增加36层网络,结果发现36层网络的效果并没有20层网络的准确率高。
同时卷积神经网络会出现梯度消失的现象,在反向传播过程中,梯度的值逐渐接近于0,导致模型权重无法正常更新,出现模型无法正常收敛的现象。这通常是由于在神经网络的早期阶段,激活函数的导数较大,而在后面的阶段,激活函数的导数较小,导致梯度消失。
假设我们的模型参数是w,更新w的方法是:w = w - ε ∂L/∂w,其中ε为学习率,L为损失函数。如果我们的网络具有n层,每层的输入输出参数分别为I1,O1,W1,...,In,On,Wn,最终的梯度值为wo,w1,...,wn。梯度消失意味着wo,w1,...,wn的值很小,接近于0。
更进一步来看,假设我们的网络具有8层,设每一层的输入输出参数分别为:I1,O1,W1,...,I8,O8,W8。用ReLU作为激活函数。在反向传播过程中,每一层的梯度值都会乘以一个系数,这个系数是该层输出值与1到该层输出值的乘积。由于ReLU函数的输出值要么是0,要么是1,所以每一层的梯度值都会被限制在一个很小的范围内,从而导致梯度消失。
为了处理梯度消失,在模型选择和实现时采取resnet网络模型,resnet网络可以优化梯度消失,并且增加特征学习的准确率。在图3中,x曲线叫做跳接,他的目的是进行同等映射,此时图中F(x)为正常的卷积学习结果,x是同等映射的结果,最终结果为H(x)=F(X)+x,假设F(x)的结果不如x的同等映射,即正常卷积层学习导致结果准确率下降,则F(x)的训练结果为0,下一层的结果为同等映射的取值。
图3:Residual Block的结构
四、模型实现
选择Resnet-152、Resnet-50、Resnet-18进行比较,Resnet-152、50、18代表不同的训练层数,根据Resnet训练的层数比较那拟合度和对测试数据的正确率。
考虑到训练集较少的数据量,卷积层训练参数可能导致测试的不稳定性,对卷积层采用迁移学习,即使用Pytorch已经训练过的大数据参数,最终只对全连接层进行训练。
5.1卷积层的实现
5.1.1每个卷积层内部的处理
考虑较少的数据集难以训练出较有代表性的参数集,采用迁移学习策略使用Pytorch模块已经大数据统计并调优的resnet参数集,如图4。
a.(conv1): 表示第一层卷积层,使用7x7的卷积核,步长为2,填充为3,不使用偏置(bias)。
b.(bn1): 表示第一层批量归一化层,它的效果是归一化输入数据,加快训练速度并提高模型性能。
c.(relu): 使用ReLU激活函数,将负值置为0,正值保持不变。
d.(maxpool): 最大池化层,使用3x3的池化窗口,步长为2。
e.(layer1): 表示ResNet中的第一个残差块,由多个bottleneck(瓶颈)结构组成。每一个bottleneck包含三个卷积层:一个用于特征提取的卷积层(conv1),一个用于增加通道数但并不改变特征图尺寸的卷积层(conv2),以及一个用于特征图尺寸下采样的卷积层(conv3)。这些卷积层之间穿插着批量归一化层(bn1、bn2、bn3)和ReLU激活函数。bottleneck还包含一个downsample残差连接,它通过一个1x1的卷积层来减小特征图的尺寸,以便与主路径上的特征图进行相加。
f.(fc): 全连接层,用于将最后的全局平均池化层的输出映射到输出类别数量。
图4:python运行的ResNet-152的参数集
默认参数不变,最终只改变特征的数量和类别个数。经过更新参数,如图4里的Linear()参数集表示为更新后为2048个特征和2个类。
5.1.2卷积层与卷积层之间的处理
总体的处理过程是通过卷积层对输入数据进行特征提取,捕捉到图像或数据中的局部特征。之后残差块中的跳跃连接(Skip Connection)则将输入数据直接传递到后面的层,使得网络可以学习残差,从而避免信息的丢失。
如图3,具体实现过程如下:
假设输入数据为x,经过一个卷积层后得到输出h(x),即:h(x)=F(x)。其中F(x)表示卷积操作。在残差块中,输入数据x会经过一个跳跃连接,直接传递到后面的层,同时与前面的卷积层的输出进行相加,得到残差输出y:y=H(x)=F(x)+x。其中H(x)表示残差操作。残差输出y再经过一个卷积层得到最终输出z:z=G(y)=F(H(x))=F(F(x)+x)。其中G(y)表示第二个卷积操作。
通过引入残差块,ResNet能够增加网络的深度,同时避免了网络退化问题。如图4,残差块的实现过程可以用公式表示为:
y=H(x)=F(x)+x
z=G(y)=F(H(x))=F(F(x)+x)
5.2全连接层的实现
训练全连接层的权重参数和偏置参数:
偏置项它其实就是函数的截距,与线性方程 y=wx+b 中的b的意义是一致的。具体来说,偏置项可以看作是一个与卷积核大小相同、但只有一个深度的数组,其中的每个元素都加到卷积的输出中。卷积层中的偏置项是为了调整模型学习数据的偏移量和偏差,从而提高模型的准确性和稳定性。
5.2.1 StepLR学习率衰减策略
在训练初期,设置较高的学习率可以帮助模型快速学习数据的大致特征,但在训练后期,过高的学习率可能会导致模型无法收敛到最优解。于是在全连接层设置优化器,采用StepLR学习率逐渐衰减的策略让模型更缓慢地更新权重,以找到最优解。具体公式如下:
S = A0* k0 ^ (f1(e / P))
训练时,总体的逻辑是将优化器的梯度归零,然后在计算损失和梯度,并执行反向传播和权重更新。在每个阶段结束时,计算当前阶段的平均损失和准确率
其中,S是当前的学习率,A0是初始学习率,k0是衰减系数,f1()表示将括号里的值向下取整,P是步长,e即每经过多少个epoch进行一次学习率的调整。初始值设置一个初始学习率,然后在每一定的训练轮数后将学习率衰减一定比例。这种方法可以保证模型在训练初期有足够的探索空间,而在训练后期逐渐减小学习率以避免过度调整参数。
5.2.2交叉熵损失函数
对于全连接层处理分类问题,选择采用交叉熵函数。在深度学习中常用于多分类任务,它结合了logSoftmax和负对数似然损失NLLLoss的计算过程。
首先,logSoftmax函数用于将模型的输出转化为概率分布。它对模型的原始输出进行指数化,并对结果取对数,然后通过减去归一化的对数值,得到每个类别的对数概率。这样可以确保每个类别的输出都是一个概率,并且概率之和为1。接下来,负对数似然损失NLLLoss用于计算模型预测的概率分布与真实标签之间的差异。NLLLoss会根据真实标签的索引,选择对应类别的对数概率作为损失值。
而交叉熵损失函数将logSoftmax和NLLLoss整合在一起,它在计算过程中同时完成了这两个步骤。它接受模型原始输出和真实标签作为输入,内部会自动进行logSoftmax操作和NLLLoss的计算,最终返回一个标量作为损失值。其中logSoftmax公式为:
NLLLoss的公式为:
NLLLoss=-log(pi)
因此交叉熵损失函数的公式为:
CE=-sum(T*logR)
其中x_i表示输入向量中的一个元素,n表示输入向量的长度,p_i表示模型预测为第i个类别的概率。T表示真实标签,R表示模型预测的概率分布。log(R)实际上就是logSoftmax函数的结果,而T * log(R)就是每个样本的负对数似然损失。因此,交叉熵函数可以看作是logSoftmax和负对数似然损失的组合。
总体上,通过循环迭代的方式,在每个轮次中处理训练和验证集,并记录最佳模型及其性能指标。通过学习率调度和参数映射,来监控和优化深度学习的训练过程。
五、模型结果
经过20轮次(Epoch)执行的损失值保持在[0.1,0.5]之间,测试集的准确率经过卷积层的筛选训练和全连接层的参数调优达到了0.96。如图5
图5:每一轮次的损失率和准确率
为比较Resnet-152和Resnet-50和Resnet-18哪个更适用于预测数据,将训练集和测试集的损失率相减,取绝对值,最后求平均值,准确率同理,最终得到图6,图7,图8
图6 restnet-18训练结果
图7 resnet-50训练结果
图8 resnet-152训练结果
最终统计得出:
图9 resnet模型比较
如图9,其中Stability_loss表示测试集和训练集的差值,Stability_acc表示测试集和训练集的准确率差值,Train_time表示模型训练时间,Best_acc表示选择最优卷积层和最优全连接层参数之后的准确率结果。明显发现随着层数增加,R模型速度逐渐下降,测试集和训练集平均损失率之差从18层到50层就发生跨域性变化,增加至0.5,但是平均准确率之差的变化却很小。很明显,随着层数增加发生了过拟合现象。
实际情况下,这是一组少量数据集训练出来的结果。在使用三种模型分别预测较多的数据集,随机在大量预测数据中抽取进行预测,往往发现resnet-152要比其他两个准确率更高。随机测试训练集中的8张图像,结果图片上方括号内为真实值,括号外为测试值。
图10:随机8张测试结果
六、问题解决
7.1 选取的最终模型
图11:最优测试的ROC曲线
经过拟合度的筛选,根据准确率和AUC,选择最优模型epoch为10的resnet-152模型,它在数据的泛化性上和准确率有着更好的处理。
7.2 模型评估
7.2.1模型效率
a.参数标准化,即选取imagenet数据集。在处理过程中降低了数据的大小,减小了数据计算压力,增加计算速度。
b.缩小图片的大小规格,本次采用244X244的规格。规格是模型内部处理速度的因素之一,适当的规格可以提高模型计算效率。
c.外部因素上可以选择gpu大幅度提升模型性能。
7.2.2模型策略
a.学习率衰减策略
防止梯度消失,使得模型在训练过程中逐渐适应较小的学习率,从而更好地优化模型参数,提高模型的收敛速度和性能。学习率衰减可以使得模型在训练过程中更快地更新权重,提高模型训练效率。同时,它可以关注那些不太容易分组的样本,从而提高模型的泛化能力。
b.迁移学习策略
模型的训练速度和性能得到了显著的提升,对于少量数据,采用对卷积层进行冻结,即卷积层的参数选取pytorch经过百万级数据训练的参数,最终只对全连接层进行学习。提高了数据的泛化性。
c.数据增强
对于较少的训练数据,采用对图像数据的各个裁剪、旋转、色相等处理。提高数据集的学习效果。
d.交叉熵处理分类问题
在处理概率值时具有数值稳定性,即当概率值非常小时,交叉熵可以防止出现数值溢出和计算精度低的问题。可以处理分类问题中的缩放问题,无论类别是否均衡,都可以给出有意义的损失值,
七、参考文献
1.Sasank Chilamkurthy,TRANSFER LEARNING FOR COMPUTER VISION TUTORIAL,https://pytorch.org/tutorials/beginner/transfer_learning_tutorial.html
2.Papaofdoudou,imagenet数据集的归一化参数,https://blog.csdn.net/tugouxp/article/details/123213423
3.阿肉~,【Pytoch】8. 梯度消失和学习速率下降,https://blog.csdn.net/qq_35272180/article/details/115326362
4.熏风初入弦,Resnet到底在解决一个什么问题呢?,https://www.zhihu.com/question/64494691