Класс SparseCategoricalCrossentropy
Класс SparseCategoricalCrossentropy вычисляет
разреженную категориальную кросс-энтропию между
истинными метками и предсказаниями модели. В отличие
от CategoricalCrossentropy, здесь истинные метки
передаются не в виде one-hot векторов, а в виде целых
чисел - индексов классов. Это удобно при большом
числе классов, так как не требует раздувать метки.
Первым параметром передается значение сглаживания
меток from_logits - нужно ли применять
активацию softmax к предсказаниям. Также можно
указать reduction - способ агрегации значений
функции потерь.
Синтаксис
tf.keras.losses.SparseCategoricalCrossentropy(
from_logits=False,
reduction='auto',
name='sparse_categorical_crossentropy'
)
Пример
Давайте вычислим разреженную категориальную кросс-энтропию для трех примеров и трех классов. Истинные метки передадим как целые числа:
import tensorflow as tf
loss = tf.keras.losses.SparseCategoricalCrossentropy()
y_true = tf.constant([0, 1, 2])
y_pred = tf.constant([
[0.9, 0.05, 0.05],
[0.05, 0.9, 0.05],
[0.05, 0.05, 0.9]
])
res = loss(y_true, y_pred)
print(res)
Результат выполнения кода:
tf.Tensor(0.105360545, shape=(), dtype=float32)
Пример
Если модель возвращает логиты без активации
softmax, нужно указать from_logits=True:
import tensorflow as tf
loss = tf.keras.losses.SparseCategoricalCrossentropy(
from_logits=True
)
y_true = tf.constant([0, 1, 2])
y_pred = tf.constant([
[2.0, 1.0, 0.1],
[0.1, 2.0, 1.0],
[1.0, 0.1, 2.0]
])
res = loss(y_true, y_pred)
print(res)
Результат выполнения кода:
tf.Tensor(0.41703033, shape=(), dtype=float32)
Пример
Класс можно использовать внутри модели через
compile. Создадим простую модель и обучим ее
на разреженных метках:
import tensorflow as tf
import numpy as np
tf.random.set_seed(0)
model = tf.keras.Sequential([
tf.keras.layers.Dense(3, activation='softmax')
])
model.compile(
optimizer='adam',
loss=tf.keras.losses.SparseCategoricalCrossentropy()
)
x = np.array([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]])
y = np.array([0, 1, 2])
model.fit(x, y, epochs=1, verbose=0)
res = model.evaluate(x, y, verbose=0)
print(res)
Результат выполнения кода:
1.0986123085021973
Смотрите также
-
класс
CategoricalCrossentropy,
который вычисляет кросс-энтропию для one-hot меток -
класс
SparseCategoricalAccuracy,
который вычисляет точность для разреженных меток -
класс
BinaryCrossentropy,
который вычисляет бинарную кросс-энтропию -
класс
KLDivergence,
который вычисляет дивергенцию Кульбака-Лейблера