Функция nn.softmax_cross_entropy_with_logits
Функция nn.softmax_cross_entropy_with_logits применяется для вычисления потерь кросс-энтропии между предсказанными логитами и истинными метками классов. Первым параметром передаются логиты (необработанные выходы нейронной сети), вторым - метки классов. Функция объединяет в себе операцию softmax и вычисление кросс-энтропии, что делает ее численно устойчивой и эффективной.
Логиты - это выходы последнего слоя нейронной сети до применения функции активации. Метки классов должны быть представлены в формате one-hot encoding или как вероятностное распределение.
Синтаксис
tf.nn.softmax_cross_entropy_with_logits(labels, logits, [name])
Пример
Давайте вычислим кросс-энтропию для простого случая с двумя классами. Создадим логиты и метки в формате one-hot encoding:
import tensorflow as tf
# Logits for two samples and two classes
logits = tf.constant([[2.0, 1.0], [1.0, 3.0]])
# One-hot encoded labels
labels = tf.constant([[1.0, 0.0], [0.0, 1.0]])
# Compute softmax cross entropy
loss = tf.nn.softmax_cross_entropy_with_logits(labels=labels, logits=logits)
print(loss)
Результат выполнения кода:
tf.Tensor([0.31326166 0.12692805], shape=(2,), dtype=float32)
Пример
Давайте вычислим среднее значение потерь для батча:
import tensorflow as tf
# Logits for three samples and three classes
logits = tf.constant([[1.0, 2.0, 3.0], [3.0, 1.0, 2.0], [2.0, 3.0, 1.0]])
# One-hot encoded labels
labels = tf.constant([[0.0, 0.0, 1.0], [1.0, 0.0, 0.0], [0.0, 1.0, 0.0]])
# Compute softmax cross entropy
loss = tf.nn.softmax_cross_entropy_with_logits(labels=labels, logits=logits)
# Compute mean loss
mean_loss = tf.reduce_mean(loss)
print(loss)
print(mean_loss)
Результат выполнения кода:
tf.Tensor([0.40760595 0.40760595 0.40760595], shape=(3,), dtype=float32)
tf.Tensor(0.40760595, shape=(), dtype=float32)
Пример
Давайте сравним результат с ручным вычислением через softmax и кросс-энтропию:
import tensorflow as tf
# Logits and labels
logits = tf.constant([[2.0, 1.0]])
labels = tf.constant([[1.0, 0.0]])
# Using softmax_cross_entropy_with_logits
loss1 = tf.nn.softmax_cross_entropy_with_logits(labels=labels, logits=logits)
# Manual computation
softmax_result = tf.nn.softmax(logits)
loss2 = -tf.reduce_sum(labels * tf.math.log(softmax_result), axis=1)
print(loss1)
print(loss2)
Результат выполнения кода:
tf.Tensor([0.31326166], shape=(1,), dtype=float32)
tf.Tensor([0.3132617], shape=(1,), dtype=float32)
Смотрите также
-
функцию
softmax,
которая вычисляет softmax для тензора -
функцию
sparse_softmax_cross_entropy_with_logits,
которая вычисляет кросс-энтропию с разреженными метками -
функцию
sigmoid_cross_entropy_with_logits,
которая вычисляет кросс-энтропию с сигмоидой -
функцию
log_softmax,
которая вычисляет логарифмический softmax