代码来源:https://github.com/rwightman/pytorch-image-models
其目录结构:
该源代码主要实现功能为CV经典三剑客中的图像分类。2012年人工智能出现爆发式增长,离不开深度神经网络的产生。经典的有Alexnet,VGG,GeogLeNet,RestNet等,本次主要对RestNet做深层次阐述。
一、README解读
最新版的ResNet来到2021年10月19日,根据README文件阐述,自2021年1月起,已经更新了23次,其更新速度确实让人满意。其次,PyTorch Image Models 是一个图像模型、层、实用程序、优化器、调度器、数据加载器/增强和参考训练、验证脚本的集合,目的是将各个SOTA模型组合在一起,得以重现ImageNet训练效果。最后,这是一个很不错的PyTorch资源,它可以和对象检测、实例和语义分割、计算机视觉/图像增强、知识蒸馏、度量学习很好的结合在一起。具体的参考论文可看
二、代码目录详解
2.1 convert文件夹里主要包含mxnet和flax,其功能分别是从mxnet和nest_flax预训练模型到pytorch模型的转换,其原因是预训练模型在不同深度学习框架中的转换是一种常见的任务。
2.2 docs文件夹里主要是一些文档的.md文件,其中包括各种模型的参数,使用步骤,使用要求,代码来源以及在ImageNet上的Top1和Top5识别准确率。如果有需要使用某一个模型,可以在docs文件夹里查找相关信息。
2.3 notebooks文件夹主要是.ipynb,该文件是交互式笔记文件,具体的作用猜测是作者写的一些笔记,大家可以具体看一看。
2.4,results文件夹主要是放置一些结果文件。
2.5 test文件夹是一些测试程序,包括对于层数,模型,优化器,工具类的测试。读者可以根据自己的需要,在这个文件夹里,测试自己模型的参数,预测最好的效果。
2.6 timm文件夹里有data,loss,model,option,scheduler,utils等python包。data包主要包含图片参数设置,可以导入路径,tar压缩包等,除此之外,还有对图片进行预处理的操作:自动增强,transforms结构等,可以使网络权重更加精确,识别效果更佳优秀。transform结构最开始来源于NLP,因为其self-attention的机制,应用于图片处理,效果也是很好,所以该结构在深度学习中,极受欢迎。
loss包中含有多标签之非对称损失函数,解决了多标签分类任务中,正负样本不平衡问题,标签错误问题。该方法,高效,容易使用。相比于最近的其他方法,该方法基于主流的网络结构,并且不需要其他的信息。当然,还有其他损失函数,比如binary_cross_entropy,cross_entropy,jsd等等。
models包中拥有很多模型的结构,具体的结构,读者可以自己看,因为很多,就不一一阐述了。如果有疑惑的地方,可以看docs文件夹里的文档说明。
optim包里是一些优化器的选择,优化器的作用是自动设置权重步长,里面有16个优化器的实现,每种优化器的作用仅仅是有小部分不同,如果读者感兴趣,可以复制python文件名字百度,拥有很多的介绍。
scheduler包主要是学习率的设置,里面是学习率的python文件实现,主要有6中学习率设置方法,还有两个python自带的定时器包。
utils包里是一些ResNet和MobileNet网络的一些工具类,主要还是为网络结构服务,请看图
2.7 avg_checkpoint.py的作用是匹配指定路径上的所有模型权重的过滤器通配符。为了取得较好的结果,这些checkpoint必须来源于相同训练。
2.8 benchmark.py 是timm模型的推理和训练步骤基准的脚本。
2.9 inference.py 是一个示例推理脚本,将文件夹中的图像的top-k类id输出到csv中。
2.10 train.py 这是一个精简的、易于修改的ImageNet训练脚本,可以重新生成ImageNet,训练结果与一些最新的网络和训练技术。它倾向于规范的PyTorch和标准的Python风格,也就是说,提供了很多的训练速度和改进结果的PyTorch示例脚本,自己可以自由选择。
2.11 vaildate.py是一个精简且易于修改的ImageNet验证脚本,其功能与train.py类似。
PyTorch版本的图像分类ResNet和MobileNet的代码目录大概就是这样的,下面开始主要讲解为什么用ResNet和MobileNet来作为图像分类的典例。
三、ResNet的优势
ResNet的主要特点增加了恒等映射,随着网络的结构加深,就不会使深度网络退化。比如,我们都知道,当网络层数的增加,会导致梯度消失或者爆炸的问题,即使训练出来模型,其识别效果反而不好。有学者证明其原因是由于反向传播导致计算复杂,参数增多等问题。于是有学者就提出当网络在某一个层数时,精确度达到最高,如果我们在下面的几层什么都不学习,仅仅复制浅层网络的特征,这样就不会造成网络退化。这样既增加了层数又提高了精度,然后,ResNet网络结构本来也是在VGG-19上做的修改,所以VGG的优势,它也有,这也是为什么选用ResNet的原因。(如果有不懂ALexNet,VGG,GeogLeNet的同学,可以看看其他人的文章,我就不多说了)
四、MobileNet的优势
训练过模型的同学都知道,无论是AlexNet还是VGG等网络模型,其参数都是很庞大的,往往一个模型都有几百兆。假如我们想要移植到一些轻便的中控机上,那么是很难实现的,于是一种轻量级网络被提出来。轻量级网络,顾名思义,就是参数少,模型小,那么,减少了参数,怎么保持识别率不会下降呢。MobileNet的基本单元是深度级可分离卷积,是一种可分解的卷积操作,与GeogLeNet类似,可以将卷积核分离成2个小的卷积核,减少了参数,但是感受野也就是特征并没有少获取。其次,将平均池化变成feature变成1*1,根据预测类别大小加上全连接层,最后一层是softmax。
五、总结
这篇博客主要通过代码引出CV里面三剑客之一的图像分类算法ResNet和部署于轻便式的MobileNet。