форма выходного тензора по keras.losses.binary_crossentropy

Я хочу реализовать пользовательскую функцию потерь в keras на основе binary_crossEntropy. У меня вопрос о форме выходного тнесора Keras.losses.binary_crossentropy. Я ожидаю, что это должен быть одномерный тензор с длиной batch_size. но он возвращает тензор с формой [размер партии, классы] с одинаковой суммой потерь в каждой строке для всех классов. следует ли мне вручную использовать max по строкам? Есть ли способ лучше? и почему результат K.binary_crossentropy не является тензором 1d? это связано с математическими понятиями?

def custom_loss(y_true, y_pred):
    loss_tensor = K.binary_crossentropy(y_true, y_pred)
    # return K.max(loss_tensor, axis=1)
    return  loss_tensor

# model.compile(loss={'classifier':'kullback_leibler_divergence'},optimizer='Nadam',metrics=['acc'])


tmp_y_true = tf.constant([[0.0, 1.0], [1.0, 0.0]])
tmp_y_pred = tf.constant([[0.8, 0.2], [0.75, 0.25]])
output = custom_loss(tmp_y_true, tmp_y_pred)
tmp_out = K.eval(output)

person Jafar Gh    schedule 22.07.2019    source источник


Ответы (2)


Формула для вычисления binary_crossentropy:

−(ylog(p)+(1−y)log(1−p))

но он возвращает тензор с формой [размер партии, классы] с одинаковой суммой потерь в каждой строке для всех классов.

Это потому, что binary_crossentropy применяется в каждом месте. Взяв первый набор в приведенном примере, y_true = [0.0, 1.0] и y_pred = [0.8, 0.2]

y_true = 0, y_pred = 0,8, применяя формулу, потери = - (0 * log (0,8) + 1 * log (1 - 0,8)) = 1,609

y_true = 1, y_pred = 0,2, применяя формулу, потери = - (1 * log (0,2) + 0 * log (1 - 0,2)) = 1,609

>>> y_true = tf.constant([0.0, 1.0])
>>> y_pred = tf.constant([0.8, 0.2])
>>> K.eval(K.binary_crossentropy(y_true, y_pred))
array([1.6094381, 1.609438 ], dtype=float32)

следует ли мне вручную использовать max по строкам?

Нет, поскольку значения закодированы в горячем режиме, необходимо брать среднее значение.

>>> K.eval(K.mean(K.binary_crossentropy(y_true, y_pred), axis=-1))
1.609438

https://github.com/keras-team/keras/blob/ed07472bc5fc985982db355135d37059a1f887a9/keras/losses.py#L76

В качестве альтернативы можно использовать categorical_crossentropy, поскольку значения закодированы в горячем режиме.

>>> K.eval(K.categorical_crossentropy(y_true, y_pred))
1.609438
person Manoj Mohan    schedule 23.07.2019

Бинарная кросс-энтропия - сбивающее с толку название. Это НЕ означает, что каждая точка данных получает либо 0, либо 1. Используется для мультиклассовых задач. Например. предсказание того, есть ли в изображении 0 dogs, 0 cats, 1 dog, 0 cats, 0 dogs, 1 cat или 1 dog, 1 cat. У каждого класса есть собственное отдельное предсказание того, присутствует он или нет. Потеря является двоичной в том смысле, что каждый класс является двоичным (присутствует или нет). Итак, ожидаемая форма вывода - [batch size, classes].

См. Дополнительную информацию по адресу:

person ubershmekel    schedule 23.07.2019