Hi All,
I would like to ask for you assistance with respect to the following error:
Error syntax: " one of the variables needed for gradient computation has been modified by an inplace operation: [torch.cuda.FloatTensor [1, 16, 3, 3]] 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!"
I am getting this error whenever I run the following code.
it = 0
start_time = time.time()
try:
for epoch in range(args[‘epochs’]):
for x in x_batches:
z = encoder(x)
out = decoder(z)
disc = discriminator(torch.lerp(out, x, args[‘reg’]))
alpha = torch.rand(args[‘batch_size’], 1, 1, 1).to(args[‘device’]) / 2
z_mix = lerp(z, swap_halves(z), alpha)
out_mix = decoder(z_mix)
disc_mix = discriminator(out_mix)
        loss_ae_mse = F.mse_loss(out, x)
        loss_ae_l2 = L2(disc_mix) * args['advweight']
        loss_ae = loss_ae_mse + loss_ae_l2
        
        opt_ae.zero_grad()
        loss_ae.backward(retain_graph=True)
        opt_ae.step()
        
        loss_disc_mse = F.mse_loss(disc_mix, alpha.reshape(-1))
        loss_disc_l2 = L2(disc)
        loss_disc = loss_disc_mse + loss_disc_l2
        
        opt_d.zero_grad()
        loss_disc.backward()
        opt_d.step()

        losses['std(disc_mix)'].append(torch.std(disc_mix).item())
        losses['loss_disc_mse'].append(loss_disc_mse.item())
        losses['loss_disc_l2'].append(loss_disc_l2.item())
        losses['loss_disc'].append(loss_disc.item())
        losses['loss_ae_mse'].append(loss_ae_mse.item())
        losses['loss_ae_l2'].append(loss_ae_l2.item())
        losses['loss_ae'].append(loss_ae.item())

        if it % 100 == 0:
            img = status()
            
            plt.figure(facecolor='w', figsize=(10,4))
            for key in losses:
                total = len(losses[key])
                skip = 1 + (total // 1000)
                y = build_batches(losses[key], skip).mean(axis=-1)
                x = np.linspace(0, total, len(y))
                plt.plot(x, y, label=key, lw=0.5)
            plt.legend(loc='upper right')
            
            clear_output(wait=True)
            plt.show()
            show_array(img * 255)
            
            speed = args['batch_size'] * it / (time.time() - start_time)
            print(f'{epoch+1}/{args["epochs"]}; {speed:.2f} samples/sec')

        it += 1

except KeyboardInterrupt:
pass
The answer provided by https://discuss.pytorch.org/t/one-of-the-variables-needed-for-gradient-computation-has-been-modified-by-an-inplace-operation-torch-cuda-floattensor-3-48-3-3-is-at-version-2-expected-version-1-instead/83241/2 seems to be relevant to my case, but still, I am unable to figure out how to refactor the code. I would greatly appreciate your assistance. The full code is available at : https://gist.github.com/kylemcdonald/e8ca989584b3b0e6526c0a737ed412f0 1
Thank you …