RuntimeError:张量的元素 0 不需要 grad 并且没有 grad_fn

Posted

技术标签:

【中文标题】RuntimeError:张量的元素 0 不需要 grad 并且没有 grad_fn【英文标题】:RuntimeError: element 0 of tensors does not require grad and does not have a grad_fn 【发布时间】:2020-03-26 22:32:51 【问题描述】:

当我运行程序时出现此错误:

但是我设置了gen_y = torch.tensor(gen_y,requires_grad=True),但这并没有帮助,gen_y.grad_fn 是 None。我也尝试x = torch.tensor(x,requires_grad=True),它也不起作用。我想这可能是与 pytorch 版本有关的问题。我该如何解决这个问题?

    def training(self, net, datasets):
        """
          input:
            net: (object) model & optimizer
            datasets : (list) [train, val] dataset object
        """
        args = self.args
        net.model.train()
        steps = len(datasets[0]) // args.batch_size
        if args.trigger == 'epoch':
            args.epochs = args.terminal
            args.iters = steps * args.terminal
            args.iter_interval = steps * args.interval
        else:
            args.epochs = args.terminal // steps + 1
            args.iters = args.terminal
            args.iter_interval = args.interval

        train_loss, train_acc = 0, 0
        start = time.time()
        for epoch in range(1, args.epochs + 1):
            self.epoch = epoch
            # setup data loader
            data_loader = DataLoader(datasets[0], args.batch_size, num_workers=4,
                                     shuffle=True)
            batch_iterator = iter(data_loader)
            for step in range(steps):
                self.iter += 1
                if self.iter > args.iters:
                    self.iter -= 1
                    break
                # convert numpy.ndarray into pytorch tensor
                x, y = next(batch_iterator)
                x = Variable(x)
                #None
                y = Variable(y)
                if args.cuda:
                    x = x.cuda()
                    y = y.cuda()
                # training
                x = torch.tensor(x,requires_grad=True)
                gen_y = net.model(x)
                gen_y = torch.tensor(gen_y,requires_grad=True)
                print(gen_y.requires_grad)
                print(gen_y.grad_fn)
                if self.is_multi:
                    gen_y = gen_y[0]
                    y = y[0]
                loss = F.binary_cross_entropy(gen_y, y)
                # Update generator parameters

                net.optimizer.zero_grad()
                loss.backward()

【问题讨论】:

请format你的代码。 去掉gen_y = torch.tensor(...这行肯定会破坏你的计算图。假设这不是唯一的问题,那么您的模型中可能有一些东西破坏了计算图。我们需要查看您的模型的详细信息以提供进一步帮助。 【参考方案1】:

我遇到了同样的错误,requires_grad = True,没有工作。如果您希望能够在第一次调用 .grad 时后退(以获取梯度作为梯度惩罚),您需要给它create_graph=True。我相信你提到的错误不是完整的错误,如果你的错误是:

> usr/local/lib/python3.6/dist-packages/torch/autograd/__init__.py in.
    backward(tensors, grad_tensors, retain_graph, create_graph, grad_variables)
         97     Variable._execution_engine.run_backward(
               tensors, grad_tensors, retain_graph, create_graph,
    ---> 99         allow_unreachable=True)  # allow_unreachable flag

然后转到“tensor.py”文件并将create_graph = False更改为create_graph = True

【讨论】:

以上是关于RuntimeError:张量的元素 0 不需要 grad 并且没有 grad_fn的主要内容,如果未能解决你的问题,请参考以下文章

运行时错误 - 张量的元素 0 不需要 grad 并且没有 grad_fn

RuntimeError:无法在需要 grad 的张量上调用 numpy()

RuntimeError:预期 1D 目标张量,不支持多目标 Python:NumPy

RuntimeError:预期的标量类型 Long 但发现 Float

RuntimeError:张量 a (4000) 的大小必须与非单维 1 的张量 b (512) 的大小相匹配

Pytorch - 张量的元素 0 不需要 grad 并且没有 grad_fn - 将矩阵相加和相乘作为 NN 步骤参数