Использование torch.nn.CrossEntropyLoss()
.Он сочетает в себе как softmax, так и кросс-энтропию.Из документации:
Этот критерий объединяет nn.LogSoftmax () и nn.NLLLoss () в одном классе.
Пример:
# define loss function
loss_fn = torch.nn.CrossEntropyLoss(reduction='mean')
# during training
for (x, y) in train_loader:
model.train()
y_pred = model(x) # your input `torch.FloatTensor`
loss_val = loss_fn(y_pred, y)
print(loss_val.item()) # prints numpy value
optimizer.zero_grad()
loss_val.backward()
optimizer.step()
Убедитесь, что типы x
и y
являются правильными.Обычно преобразование выполняется следующим образом: loss_fn(y_pred.type(torch.FloatTensor), y.type(torch.LongTensor))
.
Чтобы измерить точность, вы можете определить пользовательскую функцию:
def compute_accuracy(y_pred, y):
if list(y_pred.size()) != list(y.size()):
raise ValueError('Inputs have different shapes.',
list(y_pred.size()), 'and', list(y.size()))
result = [1 if y1==y2 else 0 for y1, y2 in zip(y_pred, y)]
return sum(result) / len(result)
И использовать обе функции следующим образом:
model.train()
y_pred = model(x)
loss_val = loss_fn(y_pred.type(torch.FloatTensor), y.type(torch.LongTensor))
_, y_pred = torch.max(y_pred, 1)
accuracy_val = compute_accuracy(y_pred, y)
print(loss_val.item()) # print loss value
print(accuracy_val) # print accuracy value
# update step e.t.c
Если ваши входные данные имеют горячее кодирование, вы можете преобразовать их в обычное кодирование перед использованием loss_fn
:
_, targets = y.max(dim=1)
y_pred = model(x)
loss_val = loss_fn(y_pred, targets)