Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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 this issue May 29, 2020 · 3 comments

Comments

@pnzr00t
Copy link

pnzr00t commented May 29, 2020

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
Copy link

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
Copy link

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
Copy link

@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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants