As per PyTorch documentation CrossEntropyLoss() is a combination of LogSoftMax() and NLLLoss() function. However, calling CrossEntropyLoss() gives different results compared to calling LogSoftMax() and NLLLoss() as seen from the output of the given code.
What could be causing different results here ?
Cross Entropy from PyTorch: tensor(2.3573)
Cross Entropy from Manual_PyTorch_NNLoss: tensor(1.0137)
def CrossEntropyPyTorch(values, actualProb):
tensorValues = torch.FloatTensor(values)
tensorActualProb = torch.FloatTensor(actualProb)
criterion = nn.CrossEntropyLoss() #LogSoftMax + NNLoss
loss = criterion(tensorValues, tensorActualProb)
return loss
def CrossEntropyManual_PyTorch_NNLoss(values, actualProb):
tensor = torch.FloatTensor(values)
tensorValues = nn.LogSoftmax()(tensor)
#Apply NNLoss
criterion = nn.NLLLoss()
tensorActualProb = torch.LongTensor(actualProb)
loss = criterion(tensorValues, tensorActualProb)
return loss
if __name__ == '__main__':
values = [-.03, .4, .5]
actualProb = [1,0,1]
print("Cross Entropy from PyTorch:",CrossEntropyPyTorch(values,actualProb))
print("Cross Entropy from Manual_PyTorch_NNLoss:",CrossEntropyManual_PyTorch_NNLoss(values,actualProb))