Правильно ли работает функция потерь 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>)

Ответы (0 шт):