I downloaded the ImageNet 2012 training and validation datasets and use them for training a ResNet-50 model. At first, during training a CUDA device-side assert error
was triggered and after some web-search, I found its cause: the targets that are provided by my training set dataloader are in the range of [1, 1000], while nn.CrossEntropyLoss
, which I use for training, expects the targets to be in [0, 999]. Simply subtracting 1 from all the targets provided by the dataloader of the training set (as suggested here) solved the problem.
While this is nice, I would like to understand a couple of things that are still mysterious to me:
- why does the training set data loader provide targets that are in the incorrect range?
- why does only the dataloader for the training set provide targets that are in the incorrect range? For the targets provided by the validation set, subtracting one is not necessary.
As far as I understood, the range of the targets is defined by how the DatasetFolder “builds” the dataset. More specifically, this depends on the make_dataset()
function, which in turn calls find_classes()
to get a dictionary class_to_idx
that maps WordNet IDs (e.g. n01440764
) to indices.
When I use find_classes()
and pass to it the directory where I unpacked the ImageNet training set, the returned class_to_idx
dictionary has values in the range of [0, 999], which seems right.
Does someone know what I am missing?
Thanks in advance