aitorzip / PyTorch-CycleGAN

A clean and readable Pytorch implementation of CycleGAN
https://arxiv.org/abs/1703.10593
GNU General Public License v3.0
1.19k stars 283 forks source link

SOLUTION: IndexError: invalid index of a 0-dim tensor. Use tensor.item() to convert a 0-dim tensor to a Python number #27

Open pnzr00t opened 4 years ago

pnzr00t commented 4 years ago

Base code use old version on pytorch. In new version we must change this code from file utils.py

            if loss_name not in self.losses:
                self.losses[loss_name] = losses[loss_name].data[0]
            else:
                self.losses[loss_name] += losses[loss_name].data[0]

By this code

            if loss_name not in self.losses:
                self.losses[loss_name] = losses[loss_name].data
            else:
                self.losses[loss_name] += losses[loss_name].data
mhaghighat commented 4 years ago

The above change triggered an error in the log method plotting the losses at the end of the epoch: TypeError: Object of type 'Tensor' is not JSON serializable

The following worked though:

    if loss_name not in self.losses:
        self.losses[loss_name] = losses[loss_name].data.cpu().numpy()
    else:
        self.losses[loss_name] += losses[loss_name].data.cpu().numpy()
Yang-Chenghao commented 3 years ago

I changed the code as follows :


    if loss_name not in self.losses:
        self.losses[loss_name] = losses[loss_name].data.cpu().numpy()
    else:
        self.losses[loss_name] += losses[loss_name].data.cpu().numpy()

However, there is a new warning:

D:\anaconda_three\envs\torch_gpu\lib\site-packages\torch\nn\modules\loss.py:431: UserWarning: Using a target size (torch.Size([1])) that is different to the input size (torch.Size([1, 1])). This will likely lead to incorrect results due to broadcasting. Please ensure they have the same size.return F.mse_loss(input, target, reduction=self.reduction)

The program can run, but some losses of train are so large. The trained model can't transform horses to zebras. The losses of train are shown as follows :

Epoch 001/200 [0299/0299] -- loss_G: 23.9003 | loss_G_identity: 7.2211 | loss_G_GAN: 2.2457 | loss_G_cycle: 14.4335 | loss_D: 0.3381 -- ETA: 2 days, 1:23:29.746444
Epoch 002/200 [0299/0299] -- loss_G: 25.3217 | loss_G_identity: 8.2631 | loss_G_GAN: 0.9344 | loss_G_cycle: 16.1242 | loss_D: 0.4901 -- ETA: 1 day, 2:24:29.635983
Epoch 003/200 [0299/0299] -- loss_G: 24.0495 | loss_G_identity: 7.8752 | loss_G_GAN: 0.4118 | loss_G_cycle: 15.7625 | loss_D: 0.1671 -- ETA: 18:44:04.579505
Epoch 004/200 [0299/0299] -- loss_G: 26.9121 | loss_G_identity: 8.4521 | loss_G_GAN: 1.0722 | loss_G_cycle: 17.3878 | loss_D: 0.2655 -- ETA: 14:53:20.721924
Epoch 005/200 [0299/0299] -- loss_G: 26.2681 | loss_G_identity: 8.3331 | loss_G_GAN: 0.6391 | loss_G_cycle: 17.2959 | loss_D: 0.1574 -- ETA: 12:34:31.602848
Epoch 006/200 [0299/0299] -- loss_G: 30.2724 | loss_G_identity: 9.8958 | loss_G_GAN: 0.8596 | loss_G_cycle: 19.5170 | loss_D: 0.1636 -- ETA: 11:01:36.345203
..........
........
.........
Epoch 198/200 [0299/0299] -- loss_G: 23.3104 | loss_G_identity: 7.7122 | loss_G_GAN: 0.4961 | loss_G_cycle: 15.1021 | loss_D: 0.0740 -- ETA: 0:02:22.066232
Epoch 199/200 [0299/0299] -- loss_G: 23.2349 | loss_G_identity: 7.7054 | loss_G_GAN: 0.4174 | loss_G_cycle: 15.1122 | loss_D: 0.0812 -- ETA: 0:01:11.011006
Epoch 200/200 [0299/0299] -- loss_G: 22.8969 | loss_G_identity: 7.6108 | loss_G_GAN: 0.3137 | loss_G_cycle: 14.9724 | loss_D: 0.0756 -- ETA: 0:00:00

I really don‘t know how to deal with this problem. Please give me a hand, thanks. (pytorch==1.4.0, python3.6, cuda 10.1, cudnn 7)

jhjeong-promedius commented 3 years ago

@Yang-Chenghao One solution is turn off the plotting loss with visdom part, by marking out line 63~68 in utils.py like below.

 60         if (self.batch % self.batches_epoch) == 0:
 61             # Plot losses
 62             for loss_name, loss in self.losses.items():
 63                 #if loss_name not in self.loss_windows:
 64                     #self.loss_windows[loss_name] = self.viz.line(X=np.array([self.epoch]), Y=np.array([loss/self.batch]),
 65                     #                                                opts={'xlabel': 'epochs', 'ylabel': loss_name, 'title': loss_name})
 66                 #else:
 67                 #    self.viz.line(X=np.array([self.epoch]), Y=np.array([loss/self.batch]), win=self.loss_windows[loss_name], update='append')
 68                 # Reset losses for next epoch
 69                 self.losses[loss_name] = 0.0

and use @pnzr00t 's loss, not mhaghighat's.

By this way, I could manage to train with reasonable loss values:

Epoch 001/200 [0001/1334] -- loss_G: 24.3092 | loss_G_identity: 5.8506 | loss_G_GAN: 6.5125 | loss_G_cycle: 11.9461 | loss_D: 4.3110 -- ETA: 3 days, 4:12:30.88724Epoch 001/200 [0002/1334] -- loss_G: 23.5266 | loss_G_identity: 5.9994 | loss_G_GAN: 5.2190 | loss_G_cycle: 12.3082 | loss_D: 3.4364 -- ETA: 2 days, 2:42:22.02774Epoch 001/200 [0003/1334] -- loss_G: 20.9999 | loss_G_identity: 5.5285 | loss_G_GAN: 4.0080 | loss_G_cycle: 11.4634 | loss_D: 2.5407 -- ETA: 1 day, 17:56:47.71281Epoch 001/200 [0004/1334] -- loss_G: 19.3021 | loss_G_identity: 5.2996 | loss_G_GAN: 3.0858 | loss_G_cycle: 10.9168 | loss_D: 2.0938 -- ETA: 1 day, 14:11:14.94724Epoch 001/200 [0005/1334] -- loss_G: 18.3379 | loss_G_identity: 5.1349 | loss_G_GAN: 2.5978 | loss_G_cycle: 10.6051 | loss_D: 1.7921 -- ETA: 1 day, 11:38:16.41092Epoch 001/200 [0006/1334] -- loss_G: 17.9617 | loss_G_identity: 5.0639 | loss_G_GAN: 2.2495 | loss_G_cycle: 10.6483 | loss_D: 1.6054 -- ETA: 1 day, 10:00:30.10605Epoch 001/200 [1334/1334] -- loss_G: 8.2629 | loss_G_identity: 2.3711 | loss_G_GAN: 0.7681 | loss_G_cycle: 5.1237 | loss_D: 0.4460 -- ETA: 1 day, 3:05:23.16512126
Epoch 002/200 [1334/1334] -- loss_G: 6.8638 | loss_G_identity: 1.9213 | loss_G_GAN: 0.7721 | loss_G_cycle: 4.1704 | loss_D: 0.4403 -- ETA: 1 day, 3:02:01.697084
Epoch 003/200 [1334/1334] -- loss_G: 6.3866 | loss_G_identity: 1.7452 | loss_G_GAN: 0.8117 | loss_G_cycle: 3.8297 | loss_D: 0.4199 -- ETA: 1 day, 3:01:23.398148
Epoch 004/200 [1334/1334] -- loss_G: 6.0889 | loss_G_identity: 1.6522 | loss_G_GAN: 0.8369 | loss_G_cycle: 3.5997 | loss_D: 0.4080 -- ETA: 1 day, 2:51:23.097955
Epoch 005/200 [0268/1334] -- loss_G: 6.0405 | loss_G_identity: 1.6105 | loss_G_GAN: 0.8430 | loss_G_cycle: 3.5871 | loss_D: 0.3919 -- ETA: 1 day, 2:50:23.114224