coldlarry/YOLOv3-complete-pruning

关于论文中稀疏训练的损失函数的疑惑

songyang86 opened this issue · 1 comments

大牛,我想问一个问题,我觉的论文《Learning Efficient Convolutional Networks Through Network Slimming》中给出的损失函数是针对需要剪枝的BN层的,而网络的最后层的损失函数还是经典的yolov3的损失函数,可以这样理解吗?根据代码的意思,最后的loss依然是经典的yolov3的损失函数值,没有加入L1正则的损失值

期待您的回复。十分感谢

在这里,作者直接根更新BN层的gamma参数,类似于权重的L1正则化:

#对要剪枝层的γ参数稀疏化
if hasattr(model, 'module'):
BNOptimizer.updateBN(sr_flag, model.module.module_list, opt.s, prune_idx)
else:
BNOptimizer.updateBN(sr_flag, model.module_list, opt.s, prune_idx)

class BNOptimizer():
@staticmethod
def updateBN(sr_flag, module_list, s, prune_idx):
if sr_flag:
for idx in prune_idx:
# Squential(Conv, BN, Lrelu)
bn_module = module_list[idx][1]
bn_module.weight.grad.data.add_(s * torch.sign(bn_module.weight.data)) # L1

不过我也有一个疑惑,在更新BN层gamma参数的时候,作者加上了L1函数导数值,我觉得应该是减去?