tf.keras.losses.CategoricalFocalCrossentropy
Вычисляет сбалансированную по alpha фокальную перекрёстную энтропию.
Наследуется от: Loss
tf.keras.losses.CategoricalFocalCrossentropy(
alpha=0.25,
gamma=2.0,
from_logits=False,
label_smoothing=0.0,
axis=-1,
reduction='sum_over_batch_size',
name='categorical_focal_crossentropy'
)
Используйте эту функцию потерь перекрёстной энтропии, когда имеется два или более класса меток и вы хотите справиться с дисбалансом классов без использования class_weights. Предполагается, что метки представлены в формате one_hot.
Согласно работе Lin et al., 2018, применение фокального множителя помогает уменьшить вес простых примеров и уделить больше внимания сложным. Общая формула фокальной функции потерь (FL) выглядит следующим образом:
FL(p_t) = (1 - p_t) ** gamma * log(p_t)
где p_t определяется следующим образом: p_t = output if y_true == 1, else 1 - output
(1 - p_t) ** gamma — это modulating_factor, где gamma — параметр фокусировки. При gamma = 0 фокальное воздействие на перекрёстную энтропию отсутствует. gamma плавно снижает значимость простых примеров.
В статье авторы используют вариант фокальной функции потерь (FL), сбалансированный по alpha: FL(p_t) = -alpha * (1 - p_t) ** gamma * log(p_t)
где alpha — весовой коэффициент для классов. Если alpha = 1, функция потерь не сможет должным образом учитывать дисбаланс классов, поскольку все классы будут иметь одинаковый вес. Это может быть константа или список констант. Если alpha — список, его длина должна совпадать с количеством классов.
Приведённую выше формулу можно обобщить следующим образом: FL(p_t) = alpha * (1 - p_t) ** gamma * CrossEntropy(y_true, y_pred)
где знак минус появляется из-за CrossEntropy(y_true, y_pred) (CE).
Расширить это выражение на случай нескольких классов несложно: FL(p_t) = alpha * (1 - p_t) ** gamma * CategoricalCE(y_true, y_pred)
В приведённом ниже фрагменте для каждого примера имеется num_classes значений с плавающей точкой. Формы y_pred и y_true — (batch_size, num_classes).
| Аргументы | |
|---|---|
alpha | Весовой коэффициент для балансировки всех классов. По умолчанию равен 0.25, как указано в источнике. Может быть списком чисел с плавающей точкой или скалярным значением. В случае нескольких классов значение alpha можно задать на основе обратной частоты классов с помощью compute_class_weight из sklearn.utils. |
gamma | Параметр фокусировки. По умолчанию равен 2.0, как указано в источнике. Он помогает плавно уменьшить значимость простых примеров. |
from_logits | Ожидается ли, что output будет тензором логитов. По умолчанию предполагается, что output кодирует распределение вероятностей. |
label_smoothing | Число с плавающей точкой в диапазоне [0, 1]. Если значение > 0, метки сглаживаются, то есть степень уверенности в значениях меток уменьшается. Например, если 0.1, используйте 0.1 / num_classes для меток нецелевых классов и 0.9 + 0.1 / num_classes для меток целевых классов. |
axis | Ось, вдоль которой вычисляется перекрёстная энтропия (ось признаков). По умолчанию — -1. |
reduction | Тип редукции, применяемой к функции потерь. Почти во всех случаях следует использовать "sum_over_batch_size". Поддерживаются варианты "sum", "sum_over_batch_size" или None. |
name | Необязательное имя экземпляра функции потерь. |
Примеры:
Самостоятельное использование:
y_true = [[0., 1., 0.], [0., 0., 1.]] y_pred = [[0.05, 0.95, 0], [0.1, 0.8, 0.1]] # Using 'auto'/'sum_over_batch_size' reduction type. cce = keras.losses.CategoricalFocalCrossentropy() cce(y_true, y_pred) 0.23315276
# Calling with 'sample_weight'. cce(y_true, y_pred, sample_weight=np.array([0.3, 0.7])) 0.1632
# Using 'sum' reduction type.
cce = keras.losses.CategoricalFocalCrossentropy(
reduction="sum")
cce(y_true, y_pred)
0.46631# Using 'none' reduction type.
cce = keras.losses.CategoricalFocalCrossentropy(
reduction=None)
cce(y_true, y_pred)
array([3.2058331e-05, 4.6627346e-01], dtype=float32)Использование с API compile():
model.compile(optimizer='adam',
loss=keras.losses.CategoricalFocalCrossentropy())
Методы
call
call(
y_true, y_pred
)
from_config
@classmethod
from_config(
config
)
get_config
get_config()
__call__
__call__(
y_true, y_pred, sample_weight=None
)
Вызов self как функции.
© 2022 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 4.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/api_docs/python/tf/keras/losses/CategoricalFocalCrossentropy