您的当前位置:主页 > 高手猛料 >
专栏 深度练习算法优化系列牛牛高手论坛429999七 ICCV 2017的一
【发布时间:2020-01-29】 【作者:admin】

  原题目:专栏 深度进修算法优化系列七 ICCV 2017的一篇模型剪枝论文,也是2019年浩大开源剪枝项方针理论根柢

  详细事理照旧谈过了,见上回的推文。993998白姐图库开奖今日武侠仙侠小说排行榜2020年6合彩开奖记录 深度研习算法优化系列七 ICCV 2017的一篇模型剪枝论文,也是2019年浩繁开源剪枝项宗旨理论根本 。这篇文章是从源码实战的角度来解说模型剪枝,源码来自:。全班人这里吃紧是相接源码来认识每个模型的归纳剪枝过程,转机能给全班人剪枝我方的模型少少启蒙。

  论文的步骤是看待每一个通说都引入一个缩放因子 ,然后和通谈的输出相乘。接着撮闭陶冶收集权重和这些缩放因子,终末将小缩放因子的通道直接移除,微调剪枝后的汇集,至极地,方向函数被定义为:

  此中 代表磨炼数据和标签, 是麇集的可锤炼参数,第一项是CNN的熬炼失落函数。 是在缩放因子上的乘法项, 是两项的平均因子。论文的演习经过落选择 ,即 正则化,这也被通常的运用于希罕化。次梯度下降法算作不腻滑(不行导)的L1惩处项的优化措施,另一个提议是利用光滑的L1正则项替代L1处罚项,尽管防备在不平滑的点利用次梯度。

  在 main.py 的达成中扶助了稀疏锻炼,个中下面这行代码即填充了寥落训练的惩罚系数 ,警觉 是感化在BN层的缩放系数上的:

  最后锻炼,考试,保存Basline模型(蕴含VGG16,Resnet-164,DenseNet40)的代码如下,代码很惯例就然则多声明这一节了:

  加载必要剪枝的模型,也便是特别磨炼获得的BaseLine模型,代码如下,此中 args.depth 用于指定VGG模型的深度,平凡为 16 和 19 :

  开始确信剪枝的全局阈值,而后凭据阈值博得剪枝后的麇集每层的通讲数 cfg_mask ,这个 cfg_mask 就不妨必定全部人剪枝后的模型的构造了,警惕这个经过不过必然每一层那极少索引的通道要被剪枝掉并赢得 cfg_mask ,还没有确凿的奉行剪枝操纵。谁们给代码加了部分阐发,该当不难懂。

  在预剪枝之后大家博得了每一个特征图须要剪掉哪些通道数的索引列表,接下来大家就也许固守这个列表奉行剪枝负责了。剪枝的圆满代码如下:

  # np.squeeze 从数组的状态中淘汰单维度条件,即把shape中为1的维度去掉

  # np.argwhere(a) 返回非0的数组元组的索引,此中a是要索引数组的条款。

  # 即使维度是1,那么就新增一维,这是为了和BN层的weight的维度成亲

  # 防备卷积核Tensor维度为[n, c, w, h],两个卷积层贯串,下一层的输入维度n就等于当今层的c

  # 警卫卷积核Tensor维度为[n, c, w, h],两个卷积层贯串,下一层的输入维度n就等于而今层的c

  到这里VGG16就被剪枝完了,剪枝完结后全班人还需要对这个新模型举办Retrain,仍然是行使 main.py 即可,参数改一下,叮咛如下:

  这样就不妨取得最终的模型了,VGG16在CIFAR10/100上剪枝并Retrain后终末的测验真相为:

  在 深度研习算法优化系列七 ICCV 2017的一篇模型剪枝论文,也是2019年庞大开源剪枝项方针理论基础 提到对待ResNet和DenseNet这种每一层的输出会算作后续多个层的输入,且其BN层是在卷积层之前,在这种情形下,疏落化是在层的输入终端取得的,一个层选择性的秉承十足通叙的子集去做下一步的卷积运算。为了在实验时令省参数和运行时光,必要睡觉一个通讲拣选层甄别出紧张的通谈。再通俗的讲明一下通谈甄别层的效率吧,对待ResNet的BN层来谈,假使这个BN层后背布置了通道辨别层就不需要做剪枝了,通说鉴别层都是放在每一个残差模块的第一个BN层后头以及绝对蚁集的终末一个BN层后头,这是源由这几个层的输入不光仅和一个层联络还和多个层相干。所觉得了坚决搜集的泛化才略,这几个BN层不剪枝,只剪枝其全班人的BN层。

  从BN层的输出膺选择通叙。它应该直接放在BN层之后,此层的输出样式由exes中的1的个数决计

  操纵长度和通谈数一样的全1向量初始化indexes, 剪枝经过中,将要剪枝的通谈对应的indexes职位设为0

  将通叙鉴别层死守前面介绍的法子放入ResNet中,代码在 models/presnet.py 中,如下声明个人是在原始的ResNet 片面BN层后头放入了通讲甄别层,其我都和原始模型相通。代码如下:

  和VGGNet几乎一律,只眷注一个大旨变动之处,就是正式剪枝的函数多了一点,这个别代码在根目录下的 resprune.py 中,全部人们贴一下相比于VGG16的改观之处的代码,也即是正式剪枝时的代码,有申明,不难:

  # np.squeeze 从数组的形状中淘汰单维度条目,即把shape中为1的维度去掉

  # np.argwhere(a) 返回非0的数组元组的索引,个中a是要索引数组的条款。

  # 假使维度是1,那么就新增一维,这是为了和BN层的weight的维度立室

  # 若是下一层是通道选择层,这个是ResNet和VGG剪枝的唯一分歧之处

  前面谈昭彰了VGGNet和ResNet的剪枝,对待DenseNet的剪枝大家只须要重视和上面两个剪枝的告辞即可。尔后侦查了一下,香港创富网正确的网址和ResNet完满齐整,因此就不再赘述了。这里只看一下结果测试:

  上面介绍了3个主流的Backbone搜集VGG16,Resnet164,DenseNet40的剪枝法子和细节,这三个网络在CIFAR10/100数据上包管精度不掉(广大状况还降低了精度)的境况下可能剪掉原始模型一半以上的参数,充足阐明了这个算法的有效性,况且也是工程嗜好的。另外这个剪枝代码合作pytorch-onnx-变更端框架也是较劲好移植的。