剪枝

开始剪枝

  1. 模型加载

修改主目录下的yolo.py 的参数"model_path"与"classes_path",更换为自己训练好的模型路径和类别类别文件路径。

  1. 剪枝

参数介绍

device:检查cuda device,默认为空,会自动检查,一般不用设置。

img-size:模型推理时图片的大小,默认为640。

no-trace:是否追踪模型并保存模型,默认是保存模型,一般不用设置。

ch_sparsity:设置通道剪枝率,默认为0.5625(9/16),可根据实际需求调整,但分母应该为4,8的倍数,如1/4,5/8,9/16等,否则会导致再训练的时网络结构并不符合,无法再训练。

根据实际推理图片大小,修改主目录下的detect_pruned.py的参数 'img-size',如640;根据实际希望剪除模型的通道百分比,修改主目录下的detect_pruned.py的参数'ch_sparsity',如0.5。修改完成后,直接运行detect_pruned.py,即可完成模型的剪枝,剪枝后的模型默认保存为model_data/step{iterative_steps}-prunedmodel-{ch_sparsity}.pth

若需要更换保存路径,请进入utils/torch_utils.py修改:

traced_script_module.save("model_data/step{}-prunedmodel-{}.pth".format(iterative_steps,ch_sparsity)y
  1. 剪枝后Fine-tune

修改train.py的参数“model_path”为剪枝模型权重路径

在yolo.py中的YoloBody实例化部分修改pruned参数为剩余的通道比例,例如剪枝率为0.7时

model = YoloBody(anchors_mask, num_classes, phi, pretrained=pretrained, phi_attention=0, pruned=0.3)

常见问题

  1. 再训练过程中,无法加载剪枝模型

一般为剪枝率的问题,需要将剪枝率分母修改成4,8的倍数,如1/4,5/8,9/16等,0.5也可行。

  1. 剪枝过程中,报结构错误

该剪枝方法目前仅支持以下模块:Linear, (Transposed) Conv, Normalization, PReLU, Embedding, MultiheadAttention, nn.Parameters and customized modules.以下运算符:split, concatenation, skip connection, flatten, reshape, view, all element-wise ops, etc.不需要剪枝或者无法剪枝的模块,请添加到参数ignored_layers。

ignored_layers = []  
     for m in model.modules():  
         if  isinstance(m,torch.nn.Conv2d ) and m.out_channels==24 and m.kernel_size== (1,1):  
             ignored_layers.append(m)  
         if  isinstance(m,se_block ) :  
             ignored_layers.append(m)  
     print(ignored_layers)

Last updated