nn.CrossEntropyLoss applies F.log_softmax internally, which would yield a different loss, if you already apply F.softmax manually on the logits (note that F.log_softmax would yield the same results) as seen here:
batch_size, nb_classes = 64, 10
logits = torch.randn(batch_size, nb_classes)
target = torch.randint(0, nb_classes, (batch_size,))
criterion = nn.CrossEntropyLoss()

loss = criterion(logits, target)
loss_sm = criterion(F.softmax(logits, dim=1), target)
loss_log_sm = criterion(F.log_softmax(logits, dim=1), target)

print(loss, loss_sm, loss_log_sm)
> tensor(2.7899) tensor(2.3108) tensor(2.7898)