冻结训练的理解与使用
冻结训练的作用:当我们已有部分预训练权重,这部分预训练权重所应用的那部分网络是通用的,如骨干网络,那么我们可以先冻结这部分权重的训练,将更多的资源放在训练后面部分的网络参数,这样使得时间和资源利用都能得到很大改善。然后后面的网络参数训练一段时间之后再解冻这些被冻结的部分,这时再全部一起训练。
参考知乎帖子:
#------------------------------------# # 冻结一定部分训练 #------------------------------------# for param in model.backbone.parameters(): param.requires_grad = False #冻结骨干网络,这部分网络有与训练权重 optimizer = optim.Adam(filter(lambda p: p.requires_grad, net.parameters()), lr=0.1) # compute loss # loss.backward() # optmizer.step() # 解冻 for param in model.backbone.parameters(): param.requires_grad = True optimizer.add_param_group({ params: param}) # compute loss # loss.backward() # optmizer.step()
这里的例子来自yolov3的一个实现,网上其他人那看到的冻结训练,在优化器中通过添加一个filter把冻结了的那部分参数给过滤了,如上面所示。
上一篇:
JS实现多线程数据分片下载
下一篇:
Ncnn框架在c++的推理及其认识