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()