I’m afraid my understanding isn’t complete yet.
        D_x = netD(x)
        
        # bCR: Forward pass augmented real batch through D
        D_T_x = netD(T_x) 
        
        errD_real = criterion(D_x, label)

        # bCR: Calculate L_real: |D(x) − D(T(x))|^2 
        L_real = l2loss(D_x, D_T_x)
        
        (errD_real + L_real).backward() # <--- backward called once for first netD evaluation
        
        # Format for print
        D_x = D_x.mean().item()
        
        # train with fake
        z = torch.randn(batch_size, nz, 1, 1, device=device)
        G_z = netG(z)
        
        # bCR: Augment generated images
        T_G_z = transform(G_z.detach())
        
        label.fill_(fake_label)
        D_G_z = netD(G_z.detach())
        
        # bCR: Forward pass augmented fake batch through D
        D_T_G_z = netD(T_G_z)
        
        errD_fake = criterion(D_G_z, label)
        
        # bCR: Calculate L_fake: |D(G(z)) − D(T(G(z)))|^2
        L_fake = l2loss(D_G_z, D_T_x)
        
        (errD_fake + L_fake).backward() <--- backward called once for second evaluation of netD

The first backward() works but the second one gives me the same error as above. Perhaps my understanding of ‘evaluation of netD’ is wrong. Do you mean evaluation of netD as in netD(x) being one evaluation and netD(y) being another?