简体   繁体   English

RuntimeError:梯度计算所需的变量之一已被就地操作修改?

[英]RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation?

I am using pytorch-1.5 to do some gan test.我正在使用pytorch-1.5进行一些gan测试。 My code is very simple gan code which just fit the sin(x) function:我的代码是非常简单的 gan 代码,正好适合 sin(x) function:

import torch
import torch.nn as nn
import numpy as np
import matplotlib.pyplot as plt


# Hyper Parameters
BATCH_SIZE = 64
LR_G = 0.0001
LR_D = 0.0001 
N_IDEAS = 5  
ART_COMPONENTS = 15 
PAINT_POINTS = np.vstack([np.linspace(-1, 1, ART_COMPONENTS) for _ in range(BATCH_SIZE)])


def artist_works():  # painting from the famous artist (real target)
    r = 0.02 * np.random.randn(1, ART_COMPONENTS)
    paintings = np.sin(PAINT_POINTS * np.pi) + r
    paintings = torch.from_numpy(paintings).float()
    return paintings


G = nn.Sequential(  # Generator
    nn.Linear(N_IDEAS, 128),  # random ideas (could from normal distribution)
    nn.ReLU(),
    nn.Linear(128, ART_COMPONENTS),  # making a painting from these random ideas
)

D = nn.Sequential(  # Discriminator
    nn.Linear(ART_COMPONENTS, 128),  # receive art work either from the famous artist or a newbie like G
    nn.ReLU(),
    nn.Linear(128, 1),
    nn.Sigmoid(),  # tell the probability that the art work is made by artist
)

opt_D = torch.optim.Adam(D.parameters(), lr=LR_D)
opt_G = torch.optim.Adam(G.parameters(), lr=LR_G)


for step in range(10000):
    artist_paintings = artist_works()  # real painting from artist
    G_ideas = torch.randn(BATCH_SIZE, N_IDEAS)  # random ideas
    G_paintings = G(G_ideas)  # fake painting from G (random ideas)

    prob_artist0 = D(artist_paintings)  # D try to increase this prob
    prob_artist1 = D(G_paintings)  # D try to reduce this prob

    D_loss = - torch.mean(torch.log(prob_artist0) + torch.log(1. - prob_artist1))
    G_loss = torch.mean(torch.log(1. - prob_artist1))

    opt_D.zero_grad()
    D_loss.backward(retain_graph=True)  # reusing computational graph
    opt_D.step()

    opt_G.zero_grad()
    G_loss.backward()
    opt_G.step()

But when i runing it got this error:但是当我运行它时出现了这个错误:

RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation: [torch.FloatTensor [128, 1]], which is output 0 of TBackward, is at version 2; expected version 1 instead. Hint: the backtrace further above shows the operation that failed to compute its gradient. The variable in question was changed in there or anywhere later. Good luck!

Is there something wrong with my code?我的代码有问题吗?

This happens because the opt_D.step() modifies the parameters of your discriminator inplace.发生这种情况是因为 opt_D.step() 就地修改了鉴别器的参数。 But these parameters are required to compute the gradient for the generator.但是这些参数是计算生成器的梯度所必需的。 You can fix this by changing your code to:您可以通过将代码更改为:

for step in range(10000):
    artist_paintings = artist_works()  # real painting from artist
    G_ideas = torch.randn(BATCH_SIZE, N_IDEAS)  # random ideas
    G_paintings = G(G_ideas)  # fake painting from G (random ideas)

    prob_artist1 = D(G_paintings)  # G tries to fool D

    G_loss = torch.mean(torch.log(1. - prob_artist1))
    opt_G.zero_grad()
    G_loss.backward()
    opt_G.step()

    prob_artist0 = D(artist_paintings)  # D try to increase this prob
    # detach here to make sure we don't backprop in G that was already changed.
    prob_artist1 = D(G_paintings.detach())  # D try to reduce this prob

    D_loss = - torch.mean(torch.log(prob_artist0) + torch.log(1. - prob_artist1))
    opt_D.zero_grad()
    D_loss.backward(retain_graph=True)  # reusing computational graph
    opt_D.step()

You can find more about this issue here https://github.com/pytorch/pytorch/issues/39141您可以在此处找到有关此问题的更多信息https://github.com/pytorch/pytorch/issues/39141

A general reason why it works on 1.4 but give an error in 1.5 is because 'Before 1.5, these tests were not working properly for the optimizers.它在 1.4 上工作但在 1.5 中出错的一般原因是因为“在 1.5 之前,这些测试对于优化器来说不能正常工作。 That's why you didn't see any error.这就是为什么你没有看到任何错误。 But the computed gradients were not correct.'但计算出的梯度不正确。

You can check this link for more discussion about the influence of version: https://discuss.pytorch.org/t/solved-pytorch1-5-runtimeerror-one-of-the-variables-needed-for-gradient-computation-has-been-modified-by-an-inplace-operation/90256/4您可以查看此链接以获取有关版本影响的更多讨论: https://discuss.pytorch.org/t/solved-pytorch1-5-runtimeerror-one-of-the-variables-needed-for-gradient-computation-已通过就地操作/90256/4 修改

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何查找导致 RuntimeError 的变量:梯度计算所需的变量之一已被原位操作修改 - How to find which variable is causing RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation RuntimeError:梯度计算所需的变量之一已被原位操作修改:PyTorch 错误 - RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation: PyTorch error RuntimeError:梯度计算所需的变量之一已被就地操作修改 - RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation 无法修复:RuntimeError:梯度计算所需的变量之一已被就地操作修改 - Can't fix: RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation 梯度计算所需的变量之一已被原位操作修改: - one of the variables needed for gradient computation has been modified by an inplace operation: 梯度计算所需的变量之一已被就地操作修改:找不到就地操作 - one of the variables needed for gradient computation has been modified by an inplace operation : can't find inplace operation Pytorch LSTM-VAE Sentence Generator:RuntimeError:梯度计算所需的变量之一已被就地操作修改 - Pytorch LSTM- VAE Sentence Generator: RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation 梯度计算所需的变量之一已通过就地操作进行了修改:[torch.cuda.FloatTensor [640]] 为版本 4; - one of the variables needed for gradient computation has been modified by an inplace operation: [torch.cuda.FloatTensor [640]] is at version 4; 错误:梯度计算所需的变量之一已被就地操作修改 - Error: one of the variables needed for gradient computation has been modified by an inplace operation PyTorch 梯度计算所需的变量之一已通过就地操作进行了修改 - PyTorch one of the variables needed for gradient computation has been modified by an inplace operation
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM