yolov7剪枝

环境

torch_pruning ==1.2.2

thop

参数解释

1
2
#pruning
parser.add_argument('--prune_method', type=str, default=None, help='prune method')#定义方法如random,l1等

方法 group_sl growing_reg`暂时不可用对yolov7的spp层不能

存在sparsity_learning = True就需要稀疏训练

1
parser.add_argument('--speed_up', type=float, default=2.0, help='speed up')

保证速度

为2.0时就是当原模型与现模型的计算量的比值为2时停止剪枝

1
2
3
4
5
6
7
8
parser.add_argument("--reg", type=float, default=5e-4)#稀疏话参数学习率
parser.add_argument("--delta_reg", type=float, default=1e-4, help='for growing regularization')
#正则化参数
parser.add_argument("--sl_hyp", type=str, default='data/hyp.scratch.sl.yaml', help='hyperparameters path for sparsity learning')
#稀疏训练的超参数可以调
parser.add_argument("--sl_epochs", type=int, default=100)
parser.add_argument("--sl_model", type=str, default="", help='sparsity learning trained model weights')

稀疏训练不能使用AMP混合精度训练,将

如何跳过某些层级

最后一层的输出不能减(可以减最后一层的内的卷积操作) attention操作需要跳过·

跳过那个层级需要导入对应的模块

1
2
3
4
5
6
7
8
9
10
ignored_layers.append(model.model[77])
#跳过cfg列表中对应的层
for cfg/training/yolov7-tiny-prune.yaml
for k, m in model.named_modules():
if isinstance(m, TSCODE_Detect):#判断t
ignored_layers.append(m.m_cls)#跳过层
ignored_layers.append(m.m_reg)
ignored_layers.append(m.m_conf)
if isinstance(m, Yolov7_Tiny_E_ELAN_Attention):
ignored_layers.append(m.att)