One fix at a time: what the three test images are classified as (ResNet-50, PyTorch 2.14, CPU)

training loss per epoch (3 seeds)

What the loss does with a class label: MSELoss broadcasts, cross-entropy picks one output

MSELoss(outputs, label): every output is compared with the number

CrossEntropyLoss(outputs, label): only the true class is pulled up

Normalisation: what the pretrained network expects to see