You are correct that nn.CrossEntropyLoss will internally apply F.log_softmax and thus no softmax activation is used in the model.
The model thus outputs logits which have values in the range [-Inf, +inf].
If you want to calculate the probability for each class during inference, you can apply F.softmax on the ouput and process them further (just don’t calculate the loss with them).
However, to get the predicted classes, you could use torch.argmax(output, dim=1), which will return the same predicted class index using the logits or probabilities, since the softmax will not change the order of logits and probabilitiies, and the highest logit will get the highest probability.