Yeah, be a bit careful about the architectures presented in papers, as they might not reflect the corresponding framework implementation.
nn.CrossEntropyLoss will apply F.log_softmax and nn.NLLLoss internally, so you should not apply an nn.Softmax layer at the end, since the workflow would then be:
(model -> out -> softmax) -> (log_softmax -> nll_loss)

where the first part is inside the model and the second in the criterion.
If the mentioned Softmax in the Figure is only used for the output of the model (not internally between layers), then just remove it.