Одним словом, да, вы можете использовать вероятности в качестве меток.
В документации для tf.nn.softmax_cross_entropy_with_logits
сказано, что вы можете:
ПРИМЕЧАНИЕ: Хотя классы являются взаимоисключающими, их вероятности
не должно быть Все, что требуется, это то, что каждая строка labels
действительное распределение вероятностей. Если это не так, вычисление
градиент будет неправильным.
Если используется эксклюзивный labels
(где один и только
один класс является истинным одновременно), см. sparse_softmax_cross_entropy_with_logits
.
Давайте рассмотрим короткий пример, чтобы убедиться, что он работает нормально:
import numpy as np
import tensorflow as tf
labels = np.array([[0.2, 0.3, 0.5], [0.1, 0.7, 0.2]])
logits = np.array([[5.0, 7.0, 8.0], [1.0, 2.0, 4.0]])
sess = tf.Session()
ce = tf.nn.softmax_cross_entropy_with_logits(
labels=labels, logits=logits).eval(session=sess)
print(ce) # [ 1.24901222 1.86984602]
# manual check
predictions = np.exp(logits)
predictions = predictions / predictions.sum(axis=1, keepdims=True)
ce_np = (-labels * np.log(predictions)).sum(axis=1)
print(ce_np) # [ 1.24901222 1.86984602]
А если у вас есть эксклюзивные метки, лучше использовать горячее кодирование и tf.nn.sparse_softmax_cross_entropy_with_logits
, а не tf.nn.softmax_cross_entropy_with_logits
и явное представление вероятности, например [1.0, 0.0, ...]
. Таким образом, вы можете получить более короткое представление.