RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation: [torch.cuda.FloatTensor [64, 3, 4, 4]] is at version 3; expected version 2 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!
After adding torch.autograd.set_detect_anomaly(True)
, a more detailed error occurs:
[W python_anomaly_mode.cpp:60] Warning: Error detected in CudnnConvolutionTransposeBackward. Traceback of forward call that caused the error:
I am training the DCGAN. Pytorch version: 1.6.0+cu101
CODE:
class Generator(nn.Module):
def __init__(self, input_nc, output_nc, ngf):
super(Generator, self).__init__()
#self.ngpu = ngpu
self.main = nn.Sequential(
# input is Z, going into a convolution
nn.ConvTranspose2d( input_nc, ngf * 8, 4, 1, 0, bias=False),
nn.BatchNorm2d(ngf * 8),
nn.ReLU(),
# state size. (ngf*8) x 4 x 4
nn.ConvTranspose2d(ngf * 8, ngf * 4, 4, 2, 1, bias=False),
nn.BatchNorm2d(ngf * 4),
nn.ReLU(),
# state size. (ngf*4) x 8 x 8
nn.ConvTranspose2d( ngf * 4, ngf * 2, 4, 2, 1, bias=False),
nn.BatchNorm2d(ngf * 2),
nn.ReLU(),
# state size. (ngf*2) x 16 x 16
nn.ConvTranspose2d( ngf * 2, ngf, 4, 2, 1, bias=False),
nn.BatchNorm2d(ngf),
nn.ReLU(),
# state size. (ngf) x 32 x 32
nn.ConvTranspose2d( ngf, output_nc, 4, 2, 1, bias=False),
nn.Tanh()
# state size. (nc) x 64 x 64
)
def forward(self, input):
return self.main(input)
class Discriminator(nn.Module):
def __init__(self, output_nc, ndf):
super(Discriminator, self).__init__()
#self.ngpu = ngpu
self.main = nn.Sequential(
# input is (nc) x 64 x 64
nn.Conv2d(output_nc, ndf, 4, 2, 1, bias=False),
nn.LeakyReLU(0.2),
# state size. (ndf) x 32 x 32
nn.Conv2d(ndf, ndf * 2, 4, 2, 1, bias=False),
nn.BatchNorm2d(ndf * 2),
nn.LeakyReLU(0.2),
# state size. (ndf*2) x 16 x 16
nn.Conv2d(ndf * 2, ndf * 4, 4, 2, 1, bias=False),
nn.BatchNorm2d(ndf * 4),
nn.LeakyReLU(0.2),
# state size. (ndf*4) x 8 x 8
nn.Conv2d(ndf * 4, ndf * 8, 4, 2, 1, bias=False),
nn.BatchNorm2d(ndf * 8),
nn.LeakyReLU(0.2),
# state size. (ndf*8) x 4 x 4
nn.Conv2d(ndf * 8, 1, 4, 1, 0, bias=False),
#nn.Sigmoid() # work with BCELoss, but BCEWithLogitsLoss has already done it
)
def forward(self, input):
return self.main(input)
def define_G(input_nc, output_nc, ngf, init_type, init_gain, gpu_ids=[]):
net = None
net = Generator(input_nc, output_nc, ngf)
return init_net(net, init_type, init_gain, gpu_ids)
def define_D(output_nc, ndf, init_type, init_gain, gpu_ids=[]):
net = None
net = Discriminator(output_nc, ndf)
return init_net(net, init_type, init_gain, gpu_ids)
Thank you for your attention!