Правильно ли работает функция потерь CrossEntropyLoss?
У меня есть модель, которая не выходе имеет 42 тензора (задача классификации изображений на 42 класса) Когда я прогоняю изображение, на выходе я получаю тензор из 42 значений весов (если я правильно понимаю) :
cnn(batch)
tensor([[ 0.0238, -0.0744, 0.0504, -0.0589, -0.1107, -0.0654, 0.0798, -0.0786,
0.0380, -0.0599, -0.0265, -0.0251, 0.0688, -0.0896, -0.0448, 0.0014,
0.0803, -0.0836, 0.0835, -0.0301, -0.0853, -0.0735, -0.0237, -0.0237,
-0.0684, -0.0204, 0.0716, 0.0237, -0.0450, 0.0935, -0.0764, -0.0056,
-0.0283, 0.0785, -0.0636, -0.0470, -0.0606, 0.0585, -0.0746, 0.0060,
0.0604, -0.0596]], device='cuda:0', grad_fn=<AddmmBackward>)
Ну и допустим для этого батча из 1 изображения есть его класс:
label
tensor([4], device='cuda:0')
Я не совсем понимаю, как работает функция потерь. На выходе имеется тензор из 42 элементов, а функция потерь считается от тензора из 1 элемента (номера класса). Понимает ли optimizer.step() в дальнейшем, что нужно максимизировать именно 4 элемент в тензоре весов, так как он отвечает за классификацию этой картинки?
loss_fn = torch.nn.CrossEntropyLoss()
loss_fn(cnn(batch), label)
tensor(3.6994, device='cuda:0', grad_fn=<NllLossBackward>)