Besides the issue of the “overconfident” model predicting one class (I don’t know what’s causing this), I would recommend to use F.log_softmax instead of torch.log(torch.softmax()) for better numerical stability.
Alternatively, you could also pass the outputs of the last layer (logits) directly to nn.CrossEntropyLoss.