前言

最近就接触了这么多,所以更加深层的还没有了解,所以这边只能说大致说一下idea,一方面供自己以后来看,另一方面给大家分享我的观点,可能以后还会有一些研究,等到有干货再过来分享研究。算是先在这里挖个坑,以后慢慢填。

模型为什么要剪枝???

因为大多数模型都是在PC上运行,因为有足够的显卡,所以虚无考量速度等问题,最算是考量也不需要做大量的功课,所以基本上很大的网络比如跑VGG都是压力比较小的,但是如今的很多网络不能很好地践行的主要原因就是很多东西需要移动端,也就是所谓的嵌入端跑,比如嵌入一个linux环境或者android环境进行移植,之后让训练好的model在移动端也可以充分利用,这才是关键,比如人人都有手机,那让你自己训练的model能够嵌入到app中那就是价值,所以需要这个过程,而整个过程最大的问题就是硬件的内存和硬件的处理器,毋容置疑你在pc上可以gpu跑而放到手机上基本都是cpu跑,速度可想而知,所以可以总结为以下两点难点

  • 速度
  • 内存

当然还需要在这两点优化的基础上,保持精度,所以也就自然而然出现一些办法

  • 尝试创造出轻量级网络比如mobilenet,虽然已经是用减少acc的代价来增快fps和减小尺寸,但想完全做到实时或者很快,让用户用着很爽还是有一些问题所在
  • 训练好的model进行量化处理, float32->int8
  • 训练好的model进行剪枝处理
    这里主要说一下剪枝

为什么要做剪枝呢?终于引出这个话题
因为在训练的很多卷积神经网络中的卷积核并非每个都是完全有用的,也就是说很多卷积核是赘余的。
两种可能

  • 去掉整个卷积核,整个都是赘余的
  • 去掉卷积核中的某些权重,因为整个卷积核中的某些权重是赘余的

几种剪枝类型

这几种也是我接触过的,本人不才,刚刚接触这些东西,望谅解

  • 稀疏剪枝(这个没有看到具体论文,只看到别的论文中提到,估计太常见了)
  • fiters pruning
  • channel pruning

对应相关论文

Pruning Filters for Efficient ConvNets

Channel Pruning for Accelerating Very Deep Neural Networks

稀疏剪枝

这种剪枝方式就相当于上面两种可能中的第二种,差不多可以理解为操作方式就是

  1. 取训练好的model
  2. 取出每一个CNN的卷积核
  3. 取出每个卷积核的weight
  4. 设置一个阈值,比如接近0的阈值
  5. 每个weight进行比较比这个阈值小就直接设为0(或者接近0)即可
  6. 之后可以重新反复剪枝后retrain,之后再不断剪枝

这种方法虽然很多赘余的权重全被减掉了,对于速度,因为剪枝之后计算和存储都相当于稀疏矩阵的方式,所以有特定的加速计算的方式,对于稀疏矩阵,对于存储也是会采用0×次数类似的方式来减小尺寸,所以速度和存储大小都会被优化。

fiters pruning

根据paper来操作
Pruning Filters for Efficient ConvNets

  1. 取训练好的model
  2. 取出每一个CNN的卷积核
  3. 计算每个卷积核的所有权重之和大小
  4. 设置一个阈值,比如为1
  5. 如果这个卷积核的权重值和小于1则直接剔除掉
  6. 对于caffe来讲一个要剔除caffemodel的卷积核,一个是要剔除网络文件定义的卷积核
  7. 最后生成新的model和网络文件
  8. retrain

这种方法可以瞬间减小你的model的尺寸,并且加快速度,因为你的计算量明显减小了,并且model中的卷积核的个数也少了,也就是说你总体的权重少了,剩下来的都是默认有用的卷积核或者权重,但是问题来了,就是精度会大大降低,因为这个也没告诉你怎么剪枝,具体每层每层之间怎么裁剪,只能不断尝试,我有一些小总结,当然我的操作是在Mobilenet上的操作。

  1. 前面一两层最好不剪枝,或者少量剪枝
  2. 和SSD有关联的层尽量不剪枝,或者少剪枝
  3. 剪枝之后一定要retrain,acc会上升一些,但是不要次数过多,会over-fitting
  4. 如果你的时间很多可以尝试,每次裁剪一层一点点,或者整个网络都裁剪一点点,之后retrain之后再裁剪,不断剪枝-》retrain-》再剪枝-》再retrain

channel pruning

根据paper来操作
Channel Pruning for Accelerating Very Deep Neural Networks

其实和fiters的过程基本相似,唯一不同点在于如何判断那个阈值
这边的channel就是某个卷积层通过乘以每个卷积核得到的那些feature channel,来判断这些channel哪些是冗余的方式来消除filters,paper中还说了一个重建,分两个,一个是重建网络,一个是重建model,我的理解就是修改这两个文件,本质还是通过这个判断来修改卷积核,paper中有github地址大家可以自行尝试一下,我目前还没有实现,paper中说比filters prune效果要好,哈哈哈哈。

总结

先挖个坑,这个领域很intereting,以后学习还会继续分享。

收藏 打印