Hello John!
To answer your most concrete question first:



 John_J_Watson:

Also, when I use these probabiliities via softmax and train, like so:
outputs = model(inputs)
outputs = torch.nn.functional.softmax(outputs, dim=1)
_, preds = torch.max(outputs, 1)



In this case preds will be the same whether you include softmax()
or remove it.  This is because softmax() maps its (algebraically)
largest input value to the largest output value.  Therefore the index
of the largest value won’t change.
(It’s not clear to me what you mean by “train.”  If you pass outputs
to a loss function, call loss.backward(), and then take an optimizer
step, you will get different results if you leave out the softmax().)
As an aside, (with recent versions of pytorch) you can call
preds = torch.argmax (outputs, 1), if you prefer.


# The output has unnormalized scores. To get probabilities, you can run a softmax on it.
print(torch.nn.functional.softmax(output[0], dim=0))



To comment a little more on this:  If your model returns the output of a
Linear layer (without passing it through something like softmax()),
the values returned should be understood as raw-score logits that
run, in principle, from -inf to inf.  Such logits are what is expected
by some loss functions, such as CrossEntropyLoss.
softmax() converts a set of logits to probabilities that run from
0.0 to 1.0 and sum to 1.0.  If you wish to work with probabilities for
some reason, for example, if your loss function expects probabilities,
then you would pass your logits through softmax().  But, conceptually,
they’re just different ways of representing the same thing – the logits
and probabilities contain (almost) the same information.
Best.
K. Frank