代码:
get_grads = torch.autograd.grad(loss, model.parameters())
完整的报错:
return Variable._execution_engine.run_backward( # Calls into the C++ engine to run the backward pass
RuntimeError: One of the differentiated Tensors appears to not have been used in the graph. Set allow_unused=True if this is the desired behavior.
对这个报错已经很多次了,可以说是相当熟练了。
上面报错是因为在手动求梯度的时候,网络里面有初始化后的权重,但是没有用到,所以就会显示为:在用该网络得到的loss与输入求Loss的时候就报改错。
几行代码,让你直接找到空的tensor(找到空的权重层),不用一个一个取分析网络了!!
如下:
1. 首先对手动求梯度加上属性:allow_unused=True(这不能解决根本问题,只是为了找到错误)
2. 使用key,value来迭代输出model.parameter中的哪个权重层是空tensor即可
gradient = torch.autograd.grad(
outputs=loss,
inputs=list(model.parameters()),
allow_unused=True, # 设置 allow_unused=True
)
# 获取模型的参数名称与参数值的映射
model_state_dict = model.state_dict()
# 打印梯度为None的张量对应的参数名称
for i, grad in enumerate(gradient):
if grad is None:
param_name = list(model_state_dict.keys())[i]
print(f"Gradient for parameter '{param_name}' is None")