2025年Resnet101模型(Resnet101模型)

Resnet101模型(Resnet101模型)p class f center p

大家好,我是讯享网,很高兴认识大家。




讯享网

 <p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2020%2F0706%2F72ec8cc3j00qd1kd200sg00ldg00id00ds.jpg&thumbnail=660x&quality=80&type=jpg"/><br/></p><p>作者 | AI 菌</p><p>出品 | CSDN博客<br/></p><p>头图 | CSDN付费下载自视觉中国</p><p><strong>前言</strong></p><p>笔者在实现ResNet的过程中,由于电脑性能原因,不得不选择层数较少的ResNet-18进行训练。但是很快发现,虽然只有18层,传统的训练方法仍然很耗时,甚至难以完成对101层的ResNet-101的训练。</p><p>出于这个原因,这一次,我将采用一种巧妙的方法——迁移学习来实现。即在预训练模型的基础上,采用101层的深度残差网络ResNet-101,对如下图所示的花数据集进行训练,快速实现了对原始图像的分类和预测,最终预测精确度达到了惊人的98%。</p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2020%2F0706%2Fcdp00qd1k87007td200nw005sg00id004f.png&thumbnail=660x&quality=80&type=jpg"/><br/></p><p><strong>迁移学习<br/></strong></p><p><strong>(1) 迁移学习简介</strong></p><p>什么是迁移学习呢?百度词条给出了一个简明的定义:迁移学习是一种机器学习方法,就是把为任务 A 开发的模型作为初始点,重新使用在为任务 B 开发模型的过程中。以我们的图像分类任务为例:</p><p>假如任务A的任务是猫狗分类,任务B是要对老虎、狮子进行分类。可以发现,任务 A 和任务 B 存在大量的共享知识,比如这些动物都可以从毛发,体型,形态等方面进行辨别。因此在已经存在一个针对任务A训练好的模型前提下,在训练任务B的模型时,我们可以不从零开始训练,而是基于在任务 A 上获得的知识再进行训练。在这里,针对A任务已经训练好的模型参数称之为:预训练模型。</p><p><strong>这和“站在巨人的肩膀上”的思想非常类似</strong>。通过迁移任务 A 的知识,在任务 B 上训练分类器可以使用更少的样本,更少的训练代价来获得不错的泛化能力。</p><p><strong>(2) 迁移学习原理</strong></p><p>为了更清楚地解释迁移学习的原理,下面借一张有意思的图进行表达:</p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2020%2F0706%2F6d6e1d85j00qd1k88001ad200u000epg00id008z.jpg&thumbnail=660x&quality=80&type=jpg"/><br/></p><p>这是一个很常见的分类网络结构图,LeNet-5、AlexNet、VGG系列、GoogLeNet等都是基于这种多个卷积层+全连接层的结构来实现的。</p><p>图中,Conv1、Conv2…ConvN指的就是N个卷积层,用来提取图像不同层次的特征。其中,浅层的Conv1、Conv2等来提取图像的浅层特征,比如:角点、纹理、明亮等;深层的ConvN-1、ConvN等来提取的是图像更为抽象的特征,比如:眼睛、鼻子、嘴巴、肢体等。而Dense层指的是全连接层,用来对已学得的特征进行组合,从而学会了如何分辨人、汽车、猫、狗等。</p><p>对于这种经典的分类网络结构,有一个特点:浅层网络识别的特征具有通用性。正是得益于这种通用性,我们才不用再重新花费大量时间和资源去训练这些浅层特征,而是借助前人已经训练好的模型,在其基础上微调,来训练出应对特定任务的模型参数。这就是所谓“站在巨人肩膀上”的思想。</p><p><strong>(3) 迁移学习的优势</strong></p><p>迁移学习的优势也很明显,主要有以下两点:</p><p><ol><li></p><p>由于是在预训练模型的基础上再进行训练,因此训练时间大大缩短,而且结果一般也比较理想。</p><p></li><li></p><p>当数据集较少时,也能训练出理想的效果。</p><p></li></ol></p><p><strong>(4) 常见的形式</strong></p><p>常见的迁移学习方式有以下三种:</p><p><ol><li></p><p>载入预训练模型后,训练所有的参数。</p><p></li><li></p><p>载入预训练模型后,只训练最后几个全连接层的参数。</p><p></li><li></p><p>载入预训练模型后,在原网络结构的基础之上再添加一层全连接层,仅训练最后一个全连接层。</p><p></li></ol></p><p><strong>预训练模型</strong></p><p>在上文中,所说的针对任务A已经训练好的模型就是预训练模型。那么在此预训练模型的基础之上,就可以继续训练任务B的模型参数了。</p><p><strong>(1) 预训练模型的获取</strong></p><p>由于我们本次要对101层的ResNet-100进行训练,因此我们可以在ResNet-101的预训练模型的基础上,再来训练针对自己任务的模型参数。对于很多经典的深度神经网路,网上都会有很多官方的预训练模型。</p><p>比如,我们本次实战所要用的ResNe-101的预训练模型就可从github上的tensorflow官方开源项目上获取:https://github.com/tensorflow/models/tree/master/research/slim</p><p>下面绿色框代表的就是我们需要下载的版本:ResNet_v1_101</p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2020%2F0706%2Fac9a3ad3p00qd1kd200ou009gg00id006z.png&thumbnail=660x&quality=80&type=jpg"/><br/></p><p>作为暖男的我,当然也考虑到有些同学可能出现github下载慢的问题,那么你可以选择从我的百度网盘下载:ResNet-101预训练模型,提取码:dg2m</p><p><strong>(2) 预训练模型的微调</strong></p><p>下载好预训练模型,解压后得到一个名为resnet_v1_101.ckpt的文件,放入如下图所示的工程文件目录下。</p><p>由于原模型是1000分类网络。而本次我们是要对花数据集进行五分类,所以我们需要对模型进行微调:去掉预训练模型的全连接层,改用节点数为5的全连接层,从而能对自定义数据集进行5分类。</p><p>实现上面这个过程,只需要先运行如下图所示的read_ckpt.py文件,就可将官网提供的预训练模型,转换为我们所需要的预训练模型。文件已上传到我的github:【AI 菌】的Github:https://github.com/Keyird/DeepLearning-TensorFlow2.0。</p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2020%2F0706%2F7369ad0cp00qd1k89000ad2006h0064g006h0064.png&thumbnail=660x&quality=80&type=jpg"/><br/></p><p>运行结束后,在原工程文件下,就会产生我们所需要的预训练权重文件,如下图红色框中所示:</p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2020%2F0706%2F427cc029p00qd1k89000hd2008n0076g008n0076.png&thumbnail=660x&quality=80&type=jpg"/><br/></p><p><strong>3. 数据集介绍</strong></p><p>这次我采用的是花分类数据集,该数据集一共有5个类别,分别是:daisy、dandelion、roses、sunflowers、tulips,一共有3670张图片。按9:1划分数据集,其中训练集train中有3306张、验证集val中有364张图片。</p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2020%2F0706%2Fcdp00qd1k87007td200nw005sg00id004f.png&thumbnail=660x&quality=80&type=jpg"/><br/></p><p>数据集下载地址:花分类数据集, 提取码:9ao5</p><p>大家下载完,将文件解压后直接放在工程根目录下,就像我这样:</p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2020%2F0706%2Fbfb25579p00qd1k8a000hd2008k008xg008k008x.png&thumbnail=660x&quality=80&type=jpg"/><br/></p><p>预训练权重和数据集准备好了,我们就可以开始实战啦!</p><p><strong>ResNet-101实战</strong></p><p>温馨提示:完整工程代码已上传我的github地址:【AI 菌】的Github 。下面仅展示各个部分的核心代码,并做出必要的解释。</p><p><strong>(1) 数据集准备</strong></p><p>注意在数据集准备过程中,一定要对原图进行预处理。因为官方提供的预训练模型,在训练前也对数据集进行预处理了的,这里要采用对应的预处理方法,通过函数pre_function()来实现。</p><p></p><p><strong>(2) 网络搭建</strong></p><p>下面是ResNet整体网络结构的实现,对于ResNet的详细网络结构,我已经在TF2.0深度学习实战(七):手撕深度残差网络ResNet中详细讲到,这里不再赘述。</p><p></p><p><strong>(3) 网络微调</strong></p><p>由于论文中ResNet-101是对ImageNet数据集进行1000分类,这里我们只对花数据集进行5分类。所以要对原网络进行微调:<strong>首先,去掉原ResNet101后面的全局平均池化和全连接层;然后,在模型后加入两个全连接层,节点数分别为1024和5,对自定义数据集进行5分类。</strong></p><p></p><p><strong>(4) 模型装配与训练</strong></p><p>在模型装配过程中,采用的是Adam优化器,CategoricalCrossentropy交叉熵损失函数,以及accuracy测试精确度。</p><p></p><p>在模型训练过程中,我设置的batch_size = 16,epochs = 20。每训练完一个eopchs后,打印出平均分类精确度;并且利用当前epochs训练出的参数,对验证集进行测试,打印出当前epochs的验证机测试精确度。最后保存模型参数。</p><p></p><p><strong>测试结果</strong></p><p><strong>(1) 图像分类结果</strong></p><p>下面就是在训练过程中,打印出来的分类精确度信息。图中红色框显示的就是测试精确度。可以看到随着训练的进行,精确度在不断地升高,最终达到91.3%。由于时间关系,这里我只训练了10个epochs,如果继续训练下去,应该可以得到更好的模型。</p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2020%2F0706%2F48ec866bp00qd1k8b000vd200tc00cwg00id0082.png&thumbnail=660x&quality=80&type=jpg"/><br/></p><p><strong>(2) 对单张图像的预测结果</strong></p><p>在工程根目录下,放入一张类别为roses的图片,将其命名为rose_test.jpg。我们读入这张图片,加载刚才已经训练好的模型,对图片进行预测。</p><p>在预测过程中,需要注意的是:</p><p><ul><li></p><p>需要对输入的图片进行预处理,预处理方式和之前保持一致。</p><p></li><li></p><p>同样要对原网络模型进行微调,微调的方法和上述网络微调的方法一致。</p><p></li></ul></p><p>预测代码在工程文件下的predict.py里,执行它即可得到预测结果。预测代码如下:</p><p></p><p>输入的图片rose_test.jpg属于rose类,图片如下:</p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2020%2F0706%2Fe4a028f8j00qd1k8b0009d2006o006og006o006o.jpg&thumbnail=660x&quality=80&type=jpg"/><br/></p><p>预测结果如下:</p><p>可见,预测结果与原图rose_test.jpg的标签一致,预测成功!且预测的概率高达98%,预测效果比较好!</p><p><strong>(3) 实际训练参数量的对比</strong></p><p>采用了迁移学习的方法训练ResNet-101后,我们在训练速度上得到很大的提升。而且得到的测试精度很高。那么下面,我们从定量的角度来分析,训练速度大大提升的原因。</p><p>下图是ResNet-101所有的卷积层参数列表,也是我们所用的预训练模型的部分,其参数量有2300万多。这部分参数是预训练模型提供的,不用训练。因此,下图红色框表示卷积层需要训练的参数量为0。</p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2020%2F0706%2F9b8930c0p00qd1k8c000bd200ew00f1g00ew00f1.png&thumbnail=660x&quality=80&type=jpg"/><br/></p><p>下图是网络微调后的网络每层参数列表。其中,绿色框表示的是卷积层的总参数量,参数量是2300万多。<strong>实际训练的是全连接层中参数,如下图红色框所示,一共是200万多个参数。</strong></p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2020%2F0706%2F1576bae9p00qd1k8c0014d200ev00efg00ev00ef.png&thumbnail=660x&quality=80&type=jpg"/><br/></p><p>由此可知,使用了迁移学习的方法后,卷积层2300万多个参数可由预训练模型提供,不需要再进行训;只需要对全连接层200万多个参数进行训练。因此,训练的速度大大提升!</p><p><strong>总结</strong></p><p>采用迁移学习的方法,我们就可以在预训练模型的基础上,再进行训练。这种思想,就如同“站在巨人的肩膀上”,不仅能减少时间和资源的开销,还能提供一个本来就不错的精确度。而我们只需要在原网络模型基础上进行微调,训练出满足自己任务的网络模型参数。</p><p>原文链接:https://blog.csdn.net/wjinjie/article/details/</p> 

讯享网
小讯
上一篇 2025-04-22 21:03
下一篇 2025-04-28 07:38

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/147145.html