1.深入解读VGGish
2.YOLO-Fastest模型结构解读
3.你觉得人工智能从业者有哪些“职业护城河”?
4.ncnn和pnnx和onnx
5.经典网络结构搜索算法 SPOS,源码快速完成模型压缩
深入解读VGGish
深度学习技术近年来取得了飞速发展,源码这一进步与开源数据集的源码普及密切相关。在图像识别领域,源码CIFAR-、源码PASCAL、源码idea导入源码失败MSCOCO以及Imagenet等数据集的源码出现推动了算法的革新。其中,源码Imagenet数据集规模庞大,源码包含万张和万个类别,源码为图像识别研究提供了丰富资源。源码然而,源码声音识别领域的源码发展却因缺乏同等规模的数据集而相对滞后,这一情况在年3月被改变,源码Google发布了由万张个人标记的源码秒YouTube视频音轨组成的数据集Audioset,数据集包含多个音频事件标签。
基于Audioset数据集,Google训练出了VGGish模型,这是本文关注的重点。VGGish模型使用了Audioset的大量音频数据进行预训练,其源代码基于TensorFlow框架实现。官方文档指出,VGGish模型在多种音频任务上表现出色,优于传统手工设计的特征如mel、cqt、mfcc等。
VGGish模型的构建和特征选择遵循了传统方法,即采用mel特征和四层卷积作为特征提取器。区别在于,VGGish模型是通过Audioset大量音频数据训练获得的,并提供了预训练参数,驱动加载工具源码这使得用户可以直接使用预训练的VGGish模型作为特征提取器,以获得较好的表现。然而,如果仅使用VGGish模型而未利用预训练参数,其效果可能不如直接使用更先进的模型网络如MobileNet或Shufflenet等,并且在使用[nums,]输出特征做为深层网络输入时,由于信息量有限,效果可能不理想。相反,直接在[nums,]之后进行全连接分类,可能获得更满意的结果。
VGGish模型的实现使用了TensorFlow 1.x框架,而多数研究工作更倾向于使用PyTorch框架。为解决这一问题,GitHub上提供了将TensorFlow模型转换为PyTorch模型的代码,包括定义相同网络结构、权重迁移和验证结果等步骤,有兴趣的读者可以自行下载并调试。
VGGish模型的源代码包含8个文件,其中预训练参数文件两个。作者在复现代码时使用的相关库版本非官方,但经过复现研究发现,VGGish模型在模型构建和特征选择方面并无显著创新,但在基于大规模数据集训练和提供预训练参数方面展现出独特优势。
为了方便用户,作者使用PyTorch生成了预训练模型参数,并上传至云盘,供用户下载使用。总体而言,VGGish模型通过利用大规模音频数据集进行预训练,软件上传网站源码提供了一种有效的音频特征提取方法,尤其适用于音频识别和分类任务,但其效果的发挥还需结合适当的网络架构和优化策略。
YOLO-Fastest模型结构解读
一、模型结构
通过源码分析,绘制了Fastest-YOLO模型的结构图。整个模型的参数量为0.M,仅为Yolov5s(参数量7.3M)的1/。在速度方面,推理一张所需时间仅为0.1ms,是Yolov5s(8ms)的1/。
网络的主体部分使用了ShuffleNetV2作为backbone(左侧),Neck部分则是light-FPN网络(下侧)。模型的头部由分类、回归、检测三个组件构成。
在参数量分析部分,应注意这里的参数指的是模型在训练过程中需要学习的参数量。ReLU和Max-Pooling层均没有参数。对于卷积层,其参数量的分析将后续补充。
附录部分涉及了ShuffleV2Block和DWConvBlocks的结构。
你觉得人工智能从业者有哪些“职业护城河”?
作为一个普通的从业者,分享一点我的感受,不一定对。我对自己的认知常年处于薛定谔的从业者状态,在程序员和研究员间徘徊。论文发的好的时候觉得模型最重要,认为搞实现的门槛太低,不值得动手。lz4 源码轮子造得好的时候觉得我的工作有现实意义,比凭空发明一些不实用的东西有意义多了。且两种状态维持动态平衡,做研究时好的点子就会顺手做成轮子开源,做实现时往往又能迸发出一些新的研究点子。所以我感觉所谓的人工智能从业者“护城河”就是需要广度+深度,实践与理论齐飞。想要在这一行做出一些成绩,单靠一方面的能力估计不易做到。
ncnn和pnnx和onnx
Pnnx作为ncnn的中间件,允许ncnn支持torchscript,简化了转换过程。它不直接是一个推理库,而是提供了一种将计算图导出为其他推理库所需文件格式的方法。
NCNN提供多种功能,包括手动修改参数、动态操作和加速技巧。这些修改通常针对与ONNX和ATEN的兼容性。通过理解和运用这些技巧,可以更好地利用NCNN的性能。
在转换过程中,涉及到一个概念叫“lower”,即使用支持的算子来模拟模型中不支持的算子。例如,如果模型包含一个带有padding的卷积,而推理库不支持padding,那么lower过程会将该卷积分解为垫阵和无padding的卷积。同样,sigmoid操作可能会被分解为多个基本操作以模拟其功能。
在将模型转换为ONNX时,app内测平台源码lower操作会重复进行两次。从python代码到torchscript再到ONNX,这会导致计算图变得庞大且细碎,不利于推理优化和模型理解。此外,这种转换可能会引入额外的算子,如Gather、Unsqueeze,这些在NCNN中可能不被支持。
Pnnx位于torchscript之下,提供了一种从torchscript导出ncnn模型的新途径,从而实现模型部署。Pnnx的算子定义与python代码的接口保持一致,支持类似于python的API。通过保留原始模型的算子定义和参数,Pnnx模型可以被轻松转换回原始python代码或导出为Pnnx。
在NCNN源码中,magic值记录了推理框架的版本号,表示模型文件的特定信息。Pnnx参考了NCNN的模型写法,支持更灵活的参数键,如字符串,以与python API保持一致。此外,Pnnx支持保留算术表达式的整体性,优化GPU和可编程硬件的性能,并提供自定义算子的导出和优化功能。
在将模型转换为Pnnx时,可以指定模块操作,如Focus,以合并多个小操作为一个大操作,提高效率。Pnnx还支持量化感知训练的算子导出,并在转换过程中记录量化参数,解决了量化模型导出的问题。此外,Pnnx允许在模型中指定输入形状,有助于优化表达式和常量折叠过程,同时支持静态和动态形状。
在Pnnx的内部图优化过程中,使用模板匹配技术从torchscript ir中找到对应的封闭子图,并将其替换为目标操作,从而优化模型结构。Pnnx提供了一个完整的框架,包括加载torchscript、转换为Pnnx ir、进行图优化和转换为python代码的过程。
当前Pnnx项目兼容PyTorch 1.8、1.9和1.版本,支持种PyTorch上层操作中种转换为NCNN对应的操作。Pnnx已经实现了自动单元测试和代码覆盖率,对于常用CNN模型如ResNet和ShuffleNet,转换和推理结果与原始python版本一致。未来计划增加更多PyTorch算子支持、增强单元测试、测试端到端RNN和Transformer模型,并编写使用教程和开发文档。
经典网络结构搜索算法 SPOS,快速完成模型压缩
Single Path One Shot(SPOS)算法是一种高效、低成本的神经网络结构搜索方法,相较于传统的基于强化学习、进化算法等方法,SPOS算法显著降低了搜索成本。MMRazor是一个深度学习模型压缩算法库,支持包括网络结构搜索、剪枝、蒸馏在内的主流技术方向,为OpenMMLab其他算法库提供即插即用、可自由组合的模型压缩算法,使得模型轻量化更为简便快捷。本文将对SPOS算法原理、搜索空间、MMRazor以及在MMRazor中的实现进行详细的解读,内容干货满满。1. SPOS算法介绍
1.1 原理介绍 SPOS算法在ECCV年提出,针对传统NAS算法中网络权重耦合度过高的问题,SPOS提出将网络权重的训练与网络结构的搜索进行解耦。首先训练超网络的权重,然后从超网络中搜索最优的子网络架构,最后对最优子网进行从头开始的训练。整个运行过程分为三个步骤:超网权重训练:使用单路径候选网络构成的超网络,通过优化每层的选择会构建一条单路径子网络。通过优化整个超网的权重完成整个优化过程。
网络结构搜索:从训练好的超网中通过进化算法找到最优的子网络。
重训练子网:在找到最优子网络后,从头开始训练。
1.2 搜索空间介绍 SPOS论文中提到的搜索空间丰富,包括choiceblock搜索、通道搜索和混合精度量化搜索。当前官方源码中仅提供了choiceblock搜索部分。SPOS的搜索空间结构如下表所示,CB代表choiceblock,共包含个CB。CB内部操作主要受ShuffleNetv2启发,提供了四种操作。2. MMRazor简介
MMRazor是一个深度学习模型压缩算法库,支持网络结构搜索、剪枝、蒸馏等主流技术方向,为OpenMMLab其他算法库提供即插即用、可自由组合的模型压缩算法,实现模型轻量化更为简便快捷。MMRazor的整体设计思想与OpenMMLab保持一致,支持多种算法库。其组织架构分为组件层、算法层和应用层。3. MMRazor中超网的构建方式
神经网络结构搜索算法中,超网的实现至关重要。算法框架至少需要具备以下功能:搜索对象是可变化的,如SPOS中的不同候选操作;搜索算法能够指定选择某个候选操作的功能。MMRazor通过引入Mutable和Mutator对象实现上述功能:通过PlaceHolder提供占位符功能,用户定义的可变位置,在调用Mutator中的convert方法后转化为Mutable对象。通过这种方式使超网变成可搜索对象Mutable,后续与Mutator进一步完成NAS任务。4. SPOS在MMRazor中的实现
4.1 环境安装
安装教程请参考:[MMRazor文档链接]。以cuda.1、pytorch1.9为例,首先安装cuda、torch、mmcv包,其中mmcv-full表示采用预编译包的安装方式,还需注意对应cuda以及torch的版本。mmcv安装详细方式以及cuda、torch、mmcv版本对应关系可见:[mmcv文档链接]。以torch1.9为例进行环境安装。 安装MMRazor推荐使用MIM安装或直接使用pip安装:pip install MMRazor。也可以通过源码安装。4.2 Config介绍
由于训练SPOS分为三个阶段,对应三个config: 以spos_supernet_shufflenetv2_8xb_in1k.py为例,config中主要有model、algorithm、mutator三个对象,其中algorithm中包含architecture对象,architecture对象中则包含model。在初始化algorithm的过程中,algorithm会初始化architecture,并根据是否传入mutator、pruner、distiller来决定是否初始化这三个对象。4.3 超网权重训练(Pre-training)
完成以上准备工作后,进行第一个阶段训练:超网权重训练。这个过程需要不断地从超网中采样子网,迭代优化子网参数,最终得到优化后的超网。训练命令如下所示,SPOS中超网训练通过随机采样的方式优化网络,每次前向训练一个batch的过程中会随机采样一个子网络。4.4 网络结构搜索(Evolution search)
此过程初始化候选池,从预训练好的SuperNet中得到Subnet在测试集上的结果,根据得分更新候选池的Topk并执行Mutation和CrossOver操作,得到最优子网的网络结构。训练命令如下所示,这里需要用到上一步超网权重的路径$STEP1_CKPT。具体Searcher选择的是EvolutionSearcher。4.5 重训练子网(Retrain)
在上一步通过进化算法得到最优子网结构后,将其对应的子网络从头进行训练,得到最终的可用网络模型。训练命令如下所示,需要将algorithm.mutable_cfg参数传入,该参数为上一步得到的yaml文件位置。训练过程与训练普通分类网络完全一致。5. 总结
本文详细解读了经典的网络结构搜索算法SPOS及其在MMRazor中的实现流程。SPOS算法能够与各类代码库搭配使用,如与MMDetection库的配合,实现便捷的DetNAS算法。MMRazor不仅包含NAS相关算法,还有蒸馏和剪枝等功能。欢迎体验,如对您有帮助,欢迎点个star。更多内容可查看[相关链接]。