网站版面做好,开发一个小程序流程,网站开发学什么好,广州建网站藤虎深度学习实践——卷积神经网络实践#xff1a;裂缝识别
系列实验 深度学习实践——卷积神经网络实践#xff1a;裂缝识别 深度学习实践——循环神经网络实践 深度学习实践——模型部署优化实践 深度学习实践——模型推理优化练习 深度学习实践——卷积神经网络实践#xff…深度学习实践——卷积神经网络实践裂缝识别
系列实验 深度学习实践——卷积神经网络实践裂缝识别 深度学习实践——循环神经网络实践 深度学习实践——模型部署优化实践 深度学习实践——模型推理优化练习 深度学习实践——卷积神经网络实践裂缝识别 深度学习实践——卷积神经网络实践裂缝识别0 概况1 AlexNet分类1.1 数据集选取1.2 模型构建1.3 超参数调整 2 RestNet50分类2.1 模型构建 2.2 超参数调整2.3 AlexNet与RestNet50的比较 3. 模型可视化诊断——grad_cam算法实验结论 代码位于可见于https://download.csdn.net/download/weixin_51735061/88131376?spm1001.2014.3001.5503 0 概况
方法 实验主要通过python中的pytorch环境进行利用了pycharm与jupyter notebook来编写代码。对于数据集我选择了墙面裂缝数据集。基本模型选择了AlexNet而高一级模型选择了RestNet50。模型的可视化诊断选择了CAM算法。实验主要通过调整参数的方法来进行。
步骤
编辑训练代码与下载数据集利用AlexNet模型进行训练并调整参数以取得较好结果利用RestNet50模型进行训练并调整参数以取得较好结果使用CAM算法进行可视化诊断
1 AlexNet分类
1.1 数据集选取
裂缝是一个建筑物中必有的现象有些裂缝十分地小需要放大很多倍才能观看到而有些裂缝却是十分大以至于肉眼可见。一般来说大裂缝是建筑物损坏的体现研究建筑物的裂缝具有一定的意义。传统的裂缝发现方法是通过目测进行的而如今进入了机器学习飞速发展的时代那么是否可以将裂缝识别交给机器呢因此此次实验的数据集我选择了与本专业相关的裂缝数据集数据集文件结构如下图所示。 基本上此分类问题为二分类问题数据集总共提供了5.6万张桥面、墙面、路面带裂缝与不带裂缝的数据集。由于计算机资源有限我选择了墙面的数据集并对数据进行了平衡处理最后使用了7000张图片进行训练墙面的部分数据如下图所示。 数据集引用 https://www.sciencedirect.com/science/article/pii/S2352340918314082
1.2 模型构建
在这里我选择了12年的AlexNet作为卷积神经网络的架构AlexNet是对LeNet的延伸如下图为两者的网络架构图。AlexNet相比于LeNet对图片的尺寸进行了提高同时加多了三个卷积层同时网络复杂度均有所提高。 对于AlexNet我直接选择了pytorch里的AlexNet模型开始时我选择了带有pretrained权重的模型但是后面发现pretrained对训练出来的结果不利所以将pretrained改为了False其导入方式如下
import torchvision.models as modelsmy_alexnet models.alexnet(pretrainedFalse)由于alexnet默认输出的有1000个种类而裂缝数据集只有两个类别所以需要首先更改alexnet的输出类别其更改方式如下 由于alexnet默认输出的有1000个种类而裂缝数据集只有两个类别所以需要首先更改alexnet的输出类别其更改方式如下
# 定位输出层位置
n_inputs my_alexnet.classifier[6].in_features
# 输出两个种类
last_layer nn.Linear(n_inputs, 2)
my_alexnet.classifier[6] last_layer微调好alexnet后对图像进行预处理首先先修改图像的尺寸以符合模型要求然后对图像进行裁剪进行标准化处理等。在预处理完后剩下的就是参数调整包括学习率、迭代次数、优化器、损失函数等等以及结果可视化。为了更好地调整参数与可视化结果我在本人上学期大作业的代码基础上进行了调整得到的程序的功能图如下。 程序的构成主要如下类图所示
1.3 超参数调整
1 基础超参数
epochs为50batch_size为32学习率为0.1优化器为SGD优化器损失函数为交叉熵。基础参数训练出来的结果如下 损失曲线 损失曲线指的是在不同epochs次数时对应的损失指这里的损失值是训练集的损失值。下图为损失曲线图。 准确率、精确率、召回率、F1值 这里的准确率、精确率、召回率、F1值指的是测试集的值这里的测试集从7000张数据集中产生。一开始时将完整的数据集以4:1的比例分为了两份占比为4的为训练集为1的是测试集。测试集不参与训练的过程所以训练出来的模型对测试集进行预测的结果具有一定的评价意义而下面即是结果图。 部分预测图像 部分预测图像是指训练出来的模型对测试集进行预测后打上标签的图像这里取了20张进行展示其中标红的表示识别错误标绿的表示识别正确。
2 改变Epoch次数 查阅资料后发现epoch次数与训练的结果具有很大的联系因为epoch的次数越大梯度下降的次数也就越多那么权重更新地幅度也应该越大。一般来说epoch次数越大其拟合效果会越好但是同时epoch若超过一定的范围会照成过拟合。由于epoch对结果的影响较大所以此处选择了epoch次数作为调整的超参数之一以下为epoch次数分别为25、50、75、100的调整结果 损失曲线 对比不同epoch次数的曲线图可以知道随着epoch次数的增加其损失值也会随之减小但是其减小的速率也随着次数的增加而减小。 准确率、精确率、召回率、F1值 从上图可知在epoch次数为25时准确率是比较小的而在50及以上时准确率得到了一定的提升。这说明epoch次数在一定范围内越大会使得准确率越高。然而当次数达到50以后准确率的提高不大甚至出现了降低的现象个人认为这可能与模型以及其他参数存在关系。而可能是这些关系阻止了准确率再次得到较大的提升。
3 改变batch size batch_size对模型的稳定性具有一定的影响batch_size越大其稳定性会越好训练时间也会较短但是如果超出一定范围会使得模型的泛化能力下降。而如果batch_size较小那么就会使得梯度下降的稳定性较差让随机性越大模型效果也会较差。由于batch_size对模型有一定的影响所以这里我选择了batch_size作为调整的超参数之一。将batch_size分为16、32、48、64四组进行调整其结果如下
损失曲线 由图像可知随着batch size的增加损失值也会跟着减小。这可能是由于一批的数量再不断变大而使得训练的效果更好。而图中出现批数大小越大使得曲线越不稳定的现象其实是因为刻度范围的问题而这也可以看出batch size越大那么其一开始的损失值就会越小。准确率、精确率、召回率、F1值 由上图结果可知效果最好的出现再batsize为16的时候而按照理论上说应该batch size较大的效果会比较好然而这里却出现了相反的现象当batch size达到64时其效果是最差的。这可能与batch size较大时的泛化能力较差有关。
4 改变学习率 学习率对模型的收敛具有一定的影响一般来说学习率越大模型收敛就会越快。然而如果学习率过大那么也会造成不利的影响因为过大会使得下降得过快而使得模型走歪路而很难找到正确的道路。现在将学习率分为1、0.1、0.01、0.001四组进行调整其结果如下 损失曲线 从上图可以看出当学习率较大时比如上面的1那么训练时埋得步长也越大其损失值下降也越快但是同时也会因为这样而走错了道路使得不断折返而不断在一个损失值范围内而无法再往低处走。而当学习率较小时其曲线会较为平缓但同时速度也会较慢。 准确率、精确率、召回率、F1值 从上面的结果可以看出学习率过大与过小都是不好的只有再一定范围内才是较好的选择。
2 RestNet50分类
2.1 模型构建
鉴于RestNet50的网络结构更复杂深度更深其效果理论上会越好所以我选择了RestNet50作为高一级的模型于AlexNet进行比较。对于RestNet我直接使用了Pytorch进行调取下面为调取的代码 my_resnet50 models.resnet50(pretrainedTrue)# 将resnet50最后一层输出的类别数改为ant-bee数据集的类别数修改后改成梯度计算会恢复为默认的True
fc_inputs my_resnet50.fc.in_features
my_resnet50.fc nn.Sequential(nn.Linear(fc_inputs, len(self.classes)))
# 以上操作相当于固定网络全连接层之前的参数只训练全连接层的参数其中对其输出层进行了修改以符合数据集的特征。
2.2 超参数调整
为了与alexnet形成对比所以超参数的调整也与alexnet的一致。
1 基础超参数 epochs为50batch_size为32学习率为0.1优化器为SGD优化器损失函数为交叉熵。基础参数训练出来的结果如下 损失曲线 准确率、精确率、召回率、F1值 部分预测图像
2 改变Epoch次数
损失曲线 从上面的损失曲线图可知随着Epoch次数的增加其损失值也会越小其结果基本与AlexNet一致。准确率、精确率、召回率、F1值 由上面结果可知随着epoch的增加其准确率也会越高但是当到达一定值后准确率却会降低。
3 改变Batchsize 损失曲线 准确率、精确率、召回率、F1值
4 改变学习率 损失曲线 准确率、精确率、召回率、F1值
2.3 AlexNet与RestNet50的比较
在基础超参数的情况下将resnet-50与alexnet进行比较其结果如下
损失曲线 可以看到AlexNet所对应的损失值较小都是收敛未完全而RestNet损失值却很大收敛较快但是稳定性较差。准确率、精确率、召回率、F1值 可以看到作为高级模型的resnet与alexnet对比相差不多甚至resnet还差于alexnet。而除去基础超参数在epoch为75时存在restnet准确率为0.8的这也可能是基础超参数情况下resnet的参数并不太好照成了这种现象。然而观察两个模型的结果可以发现其准确率一直都是很低的当一开始使用alexnet时认为这可能与alexnet模型有关但是当使用restnet这个更高级的神经网络时其结果变化不大还是很低那么其原因可能出现与其他原因。首先应该可以排除基本的参数原因因为参数都以不同的数值进行调试但是其结果均不是很好。因此我从数据集中寻找原因观察预测的数据如下所示 可以发现判断错误的一般都是将裂缝墙体判断为无裂缝的而仔细观察图像可以发现判断无裂缝错误的裂缝图像的裂缝都是十分小的。甚至人眼判别都难以判别而对于机器可能这也是其难度之一因此造成了准确率整体偏低的现象。在发现此问题后我观察了路面裂缝的数据集发现其比墙面裂缝数据集较为好识别所以我将两者在基础参数的前提下重新进行了训练得到以下的结果 可以看到道路裂缝的准确率可以达到90%确实比墙面的高很多而这也证明了墙面数据集存在一定的问题。
3. 模型可视化诊断——grad_cam算法
对于模型的可视化诊断我选择了梯度权重激活图算法grad-cam此算法能够反映出模型内部主要是靠识别哪个位置来进行分类的也就是其注重点是如何。为了检测模型是否注意正确现了选取三张图片分别用前面的基本超参数下的AlexNet与ResNet对其进行预测然后对其使用Grad_CAM算法生成类激活图。下面为算法生成的结果 理论上来说若要识别裂缝那么注重点肯定是在裂缝处的。而从上图可以看到restnet50模型的CAM图明显优于alexnet的restnet的集中位置更靠近于裂缝中而alexnet却只是在裂缝中徘徊并未完全地对准裂缝。虽然得到的模型中两者的准确率基本差不多但是restnet的精确性更加地好。
实验结论
本次实验中构建了AlexNet和RestNet网络模型对裂缝数据集进行训练并调整超参数以达到较好效果。两个网络模型的测试结果表明其在调整一系列参数如学习率、epoch次数、batchsize后准确率依然在0.7到0.8中徘徊效果并不佳。而在比较参数为不同值的调整时发现其规律基本与理论相符合比如说学习率在某个范围内才是最优的。最后在利用grad_cam算法对模型进行可视化诊断时发现restnet50对裂缝的注意程度优于alexnet的restnet50的注意点集中于裂缝处而alexnet却只是在裂缝附近。 对于模型训练出来的效果较差个人认为这可能与数据集有关。在观察数据集后发现墙面裂缝的数据集的裂缝并不明显甚至人眼也难以观测出来。于是我选用了较为明显的道路裂缝数据集以检验我的想发是否正确。在经过测试后发现路面裂缝数据集训练出来的模型准确率可以达到0.85-0.9之间而这也说明了这确实与数据集有一定关系。