PyTorch:如何查找模型中未使用的参数即find unused parameters

一个比较简单的做法是在 loss.backward() 之后和 optimizer.step() 调用之前,添加以下几行,可以找到未使用的参数(注意区分自己特地冻结的参数):

for name, param in model.named_parameters():
    if param.grad is None:
        print(name)

这将打印任何没有在损失计算中使用的参数,它们的梯度是None。

特别地,如果是mmcv系列的框架,可以在如下路径中找到:

/xxx/mmcv/runner/hooks/optimizer.py: L61 (OptimizerHook, after_train_iter())
def after_train_iter(self, runner):
    runner.optimizer.zero_grad()
    if self.detect_anomalous_params:
        self.detect_anomalous_parameters(runner.outputs['loss'], runner)
    runner.outputs['loss'].backward()

    ''' 插入以下代码
    for name, param in runner.model.named_parameters():
        if param.grad is None:
            print(name)
    import pdb; pdb.set_trace()
    '''

    if self.grad_clip is not None:
        grad_norm = self.clip_grads(runner.model.parameters())
        if grad_norm is not None:
            # Add grad norm to the logger
            runner.log_buffer.update({'grad_norm': float(grad_norm)},
                                     runner.outputs['num_samples'])
    runner.optimizer.step()
posted @ 2023-02-19 14:58  龙雪  阅读(16)  评论(0编辑  收藏  举报  来源