I am researching RaLSGAN and encounter this RuntimeError “one of the variables needed for gradient computation has been modified by an inplace operation” when running on Colab.
Perhaps, this error relates to backward function but I can’t solve it. Please help me with this problem.
for epoch in range(epochs):
for ii, real_images in tqdm(enumerate(train_loader), total=len(train_loader)):
############################
# (1) Update D network
###########################
netD.zero_grad()
real_images = real_images.to(device)
batch_size = real_images.size(0)
labels = torch.full((batch_size, 1), real_label, device=device)
outputR = netD(real_images)
noise = torch.randn(batch_size, nz, 1, 1, device=device)
fake = netG(noise)
outputF = netD(fake.detach())
errD = (torch.mean((outputR - torch.mean(outputF) - labels) ** 2) +
torch.mean((outputF - torch.mean(outputR) + labels) ** 2))/2
errD.backward(retain_graph=True)
optimizerD.step()
############################
# (2) Update G network
###########################
netG.zero_grad()
outputF = netD(fake)
errG = (torch.mean((outputR - torch.mean(outputF) + labels) ** 2) +
torch.mean((outputF - torch.mean(outputR) - labels) ** 2))/2
errG.backward()
optimizerG.step()
if (ii+1) % (len(train_loader)//2) == 0:
print('[%d/%d][%d/%d] Loss_D: %.4f Loss_G: %.4f'
% (epoch + 1, epochs, ii+1, len(train_loader),
errD.item(), errG.item()))
/usr/local/lib/python3.6/dist-packages/ipykernel_launcher.py:3: TqdmDeprecationWarning: This function will be removed in tqdm==5.0.0
Please use `tqdm.notebook.tqdm` instead of `tqdm.tqdm_notebook`
This is separate from the ipykernel package so we can avoid doing imports until
0%
0/644 [00:00<?, ?it/s]
---------------------------------------------------------------------------
RuntimeError Traceback (most recent call last)
<ipython-input-27-d298a2f96c50> in <module>()
24 errG = (torch.mean((outputR - torch.mean(outputF) + labels) ** 2) +
25 torch.mean((outputF - torch.mean(outputR) - labels) ** 2))/2
---> 26 errG.backward()
27 optimizerG.step()
28
1 frames
/usr/local/lib/python3.6/dist-packages/torch/tensor.py in backward(self, gradient, retain_graph, create_graph)
219 retain_graph=retain_graph,
220 create_graph=create_graph)
--> 221 torch.autograd.backward(self, gradient, retain_graph, create_graph)
222
223 def register_hook(self, hook):
/usr/local/lib/python3.6/dist-packages/torch/autograd/__init__.py in backward(tensors, grad_tensors, retain_graph, create_graph, grad_variables)
130 Variable._execution_engine.run_backward(
131 tensors, grad_tensors_, retain_graph, create_graph,
--> 132 allow_unreachable=True) # allow_unreachable flag
133
134
RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation: [torch.cuda.FloatTensor [1, 256, 4, 4]] is at version 2; expected version 1 instead. Hint: enable anomaly detection to find the operation that failed to compute its gradient, with torch.autograd.set_detect_anomaly(True).