Объясните код кераса - PullRequest
       1

Объясните код кераса

0 голосов
/ 27 июня 2019

Это формула категориальной кросс-энтропии: Формула категориальной кросс-энтропии Я понимаю, что выход - это вероятности классов из слоя softmax.Это правильно?Какова цель?А как этот код показывает "1 / N", "Σ", "p i, j "?

def categorical_crossentropy(output, target, from_logits=False):
"""Categorical crossentropy between an output tensor and a target tensor.
# Arguments
    output: A tensor resulting from a softmax
        (unless `from_logits` is True, in which
        case `output` is expected to be the logits).
    target: A tensor of the same shape as `output`.
    from_logits: Boolean, whether `output` is the
        result of a softmax, or is a tensor of logits.
# Returns
    Output tensor.
"""
# Note: tf.nn.softmax_cross_entropy_with_logits
# expects logits, Keras expects probabilities.
if not from_logits:
    # scale preds so that the class probas of each sample sum to 1
    output /= tf.reduce_sum(output,
                            reduction_indices=len(output.get_shape()) - 1,
                            keep_dims=True)
    # manual computation of crossentropy
    epsilon = _to_tensor(_EPSILON, output.dtype.base_dtype)
    output = tf.clip_by_value(output, epsilon, 1. - epsilon)
    return - tf.reduce_sum(target * tf.log(output),
                           reduction_indices=len(output.get_shape()) - 1)
else:
    return tf.nn.softmax_cross_entropy_with_logits(labels=target,
                                                   logits=output)

1 Ответ

0 голосов
/ 27 июня 2019

Я понимаю, что вывод - это вероятности классов из слоя softmax.Это правильно?

Это может быть либо выход из слоя softmax, либо необработанные logits (входные данные для слоя softmax).Выходным вектором слоя softmax являются вероятности каждого класса.Если output является выходом softmax, тогда установите from_logits=False.Если output - логиты, то вы хотите установить from_logits=True.Внутри вы можете видеть, что вызывается tf.nn.softmax_cross_entropy_with_logits, который вычисляет вероятности softmax и функцию перекрестной энтропии одновременно.Их совместное вычисление учитывает некоторые математические приемы для числовой устойчивости.

Какая цель?

Цель - это горячий вектор.Это означает, что число n представлено вектором v, где v[n] = 1 и 0 повсюду.Здесь n - класс метки.В TensoFlow есть функция для получения этой кодировки, которая называется tf.one_hot.Например, tf.one_hot([3],5) приведет к вектору [0, 0, 1, 0, 0].

И как в этом коде отображаются "1 / N", "Σ", "pi, j"?

Приведенный выше код не усредняется по всем входам (нет необходимости в «1 / N»).Например, если вход имеет форму [10, 5], выход будет иметь форму [10].Вам нужно будет позвонить tf.reduce_mean на результат.Таким образом, уравнение по существу:

modified equation

Вышеупомянутое уравнение реализовано в строке

return - tf.reduce_sum(target * tf.log(output),
                       reduction_indices=len(output.get_shape()) - 1)

"Σ" равно tf.reduce_sum.«pi, j» равно output, индикаторная функция (то есть, выделенная жирным шрифтом 1) имеет горячее кодированное значение target.

Side Note

Вы должны использовать tf.softmax_cross_entropy_with_logits_v2, поскольку код, который вы указали (при настройке from_logits=False), может привести к числовым ошибкам.Объединенная функция решает все эти числовые проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...