彻底解决:One of the differentiated Tensors appears to not have been used in the graph. Set allow_unused=

代码:

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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值