Вы можете использовать любой порог, который сочтете подходящим.
Известно, что нейронные сети часто чрезмерно уверены (например, применяя 0.95
к одному из 50
классов), поэтому может быть полезно использовать другой порог в вашем случае.
С вашей тренировкой все в порядке, но вы должны изменить прогнозы (две последние строки) и использовать torch.nn.softmax
следующим образом:
outputs = net(inputs)
probabilities = torch.nn.functional.softmax(outputs, 1)
Как упоминалось в другом ответе, вы получит каждую строку с вероятностями, суммирующими 1
(ранее у вас были ненормализованные вероятности или логиты).
Теперь просто используйте желаемый порог для этих вероятностей:
predictions = probabilities > 0.8
Обратите внимание, что в некоторых случаях вы можете получить только нули (например, [0.2, 0.3, 0.5]
).
Это будет означать, что нейронная сеть недостаточно уверена в соответствии с вашими стандартами и, вероятно, отбросит количество неверных положительных прогнозов ( абстрактно, но, скажем, вы предсказываете, нет ли у пациента одного из взаимоисключающих 3
заболеваний. Лучше сказать так, только если вы действительно уверены). * 10 23 *
Различные пороговые значения для каждого класса
Это можно сделать так же, как это:
thresholds = torch.tensor([0.1, 0.1, 0.8]).unsqueeze(0)
predictions = probabilities > thresholds
Заключительные комментарии
Обратите внимание, в случае softmax
только один класс должен быть ответом (как указано в другом ответе), и этот подход (и упоминание о сигмоиде) может указывать, что вы после многолинейной классификации .
Если вы хотите тренировать свой сеть, чтобы он мог одновременно предсказать классы, которые вы должны использовать sigmoid
и изменить свой убыток на torch.nn.BCEWithLogitsLoss
.