这是之前读研的时候写过的工具,当时用了作为毕设的一部分。因为时间很久了,最近因为各种原因要重新翻出来咀嚼一下。
先献出源码https://github.com/Sunyouteng/darknet_prune_yoloV3
开发的过程种需要注意一下几点
1 weights中权值的存储顺序,需要先fread 偏移 和BN的相关参数,然后再加载卷积核的权重值;
2 权值的保存顺序是按照卷积核进行保存的,单个卷积核内部又是按照通道一层层进行保存;
3 剪切完某一层之后,一定要记得对其下一层的卷积核也要剪掉相应的通道,这样才能保证计算不会出错
V3相对于V2的问题是,出现了比较多的shortcut层,因此使用起来,并不是很便利,因为如果剪切完某一层之后,该层的输出就会减少,往往这一层需要shortcut,和后面的另外一层进行相加。(注:shortcut层是from 那层的输出,之前怀疑过是不是输入,打印之后确实是输出)被剪切的那层输出少了之后,维度和后面的一层就不再一致,出现无法相加的情况。因此使用时,应该避开这种情况,同时剪枝工具一次只能剪掉一层。
根据相关论文的解释,需要对整个网络做敏感度分析,因为我的laptop没有显卡,就算是运行个voc2007test数据集都要很久,所以这里就省去了这部分工作。正常的逻辑是:
1 对网络做敏感度分析,分别对某一层,剪去不同数量的卷积核,看起准确度下降曲线;
2 对多层重复上述操作ÿ