Logits просто означает, что функция работает с немасштабированным выходом более ранних слоев и что относительный масштаб для понимания единиц измерения является линейным. В частности, это означает, что сумма входных данных может не равняться 1, что значения не являются вероятностями (у вас может быть значение 5).
tf.nn.softmax
производит только результат применения функции softmax к входному тензору. Softmax «сдавливает» входы так, что sum(input) = 1
это способ нормализации. Форма вывода softmax совпадает с формой ввода: она просто нормализует значения. Выходные данные softmax можно интерпретировать как вероятности.
a = tf.constant(np.array([[.1, .3, .5, .9]]))
print s.run(tf.nn.softmax(a))
[[ 0.16838508 0.205666 0.25120102 0.37474789]]
Напротив, tf.nn.softmax_cross_entropy_with_logits
вычисляет кросс-энтропию результата после применения функции softmax (но делает все это вместе более математически аккуратно). Это похоже на результат:
sm = tf.nn.softmax(x)
ce = cross_entropy(sm)
Перекрестная энтропия является суммарной метрикой: она суммирует элементы. Выходной сигнал тензора tf.nn.softmax_cross_entropy_with_logits
формы [2,5]
имеет форму [2,1]
(первое измерение рассматривается как партия).
Если вы хотите провести оптимизацию, чтобы минимизировать перекрестную энтропию, и вы мягко используете максимальную величину после последнего слоя, вы должны использовать ее tf.nn.softmax_cross_entropy_with_logits
вместо того, чтобы делать это самостоятельно, поскольку она охватывает численно нестабильные угловые случаи математически правильным образом. В противном случае вы в конечном итоге будете взламывать его, добавляя маленькие эпсилоны здесь и там.
Отредактировано 2016-02-07:
Если у вас есть одноклассные метки, где объект может принадлежать только одному классу, вы можете теперь рассмотреть возможность использования, tf.nn.sparse_softmax_cross_entropy_with_logits
чтобы вам не приходилось конвертировать ваши метки в плотный массив с одним горячим массивом. Эта функция была добавлена после выпуска 0.6.0.
cross_entropy = tf.nn.softmax_cross_entropy_with_logits(tf.nn.softmax(tf.add(tf.matmul(x,W),b)),y) cost=tf.reduce_mean(cross_entropy)
, Но когда я пользуюсь другим способом,pred=tf.nn.softmax(tf.add(tf.matmul(x,W),b)) cost =tf.reduce_mean(-tf.reduce_sum(y*tf.log(pred),reduction_indices=1))
результат стабильнее и лучше.tf.nn.softmax_cross_entropy_with_logits(tf.add(tf.matmul(x, W, b))
в вашем случае.b
должна быть за скобками,tf.nn.softmax_cross_entropy_with_logits(tf.add(tf.matmul(x, W), b)
Укороченная версия:
Предположим, у вас есть два тензора, в которых
y_hat
содержатся вычисленные оценки для каждого класса (например, из y = W * x + b) иy_true
содержатся метки истинного кодирования в горячем виде.Если вы интерпретируете баллы
y_hat
как ненормализованные логарифмические вероятности, то они являются логитами .Кроме того, общая кросс-энтропийная потеря рассчитывается следующим образом:
по существу эквивалентно полной кросс-энтропийной потере, вычисленной с помощью функции
softmax_cross_entropy_with_logits()
:Длинная версия:
В выходном слое вашей нейронной сети вы, вероятно, вычислите массив, который содержит оценки классов для каждого из ваших обучающих экземпляров, например, из вычислений
y_hat = W*x + b
. В качестве примера ниже я создалy_hat
массив размером 2 x 3, в котором строки соответствуют обучающим экземплярам, а столбцы - классам. Итак, здесь есть 2 тренировочных экземпляра и 3 класса.Обратите внимание, что значения не нормализованы (то есть строки не суммируют до 1). Чтобы их нормализовать, мы можем применить функцию softmax, которая интерпретирует входные данные как ненормализованные логарифмические вероятности (или логиты ) и выводит нормализованные линейные вероятности.
Важно полностью понимать, что говорит выход softmax. Ниже я показал таблицу, которая более четко представляет результат выше. Можно видеть, что, например, вероятность того, что тренировочный экземпляр 1 будет «Классом 2», составляет 0,619. Вероятности классов для каждого обучающего экземпляра нормированы, поэтому сумма каждой строки равна 1,0.
Итак, теперь у нас есть классовые вероятности для каждого обучающего экземпляра, где мы можем взять argmax () каждой строки, чтобы сгенерировать окончательную классификацию. Исходя из вышеизложенного, мы можем сгенерировать, что обучающий экземпляр 1 принадлежит «Классу 2», а обучающий экземпляр 2 принадлежит «Классу 1».
Верны ли эти классификации? Нам нужно сравнить с настоящими ярлыками из учебного набора. Вам потребуется
y_true
массив с горячим кодированием , где снова строки - это обучающие экземпляры, а столбцы - это классы. Ниже я создал примерy_true
массива «один горячий», где истинная метка для обучающего экземпляра 1 - «Класс 2», а истинная метка для обучающего экземпляра 2 - «Класс 3».Распределение вероятностей
y_hat_softmax
близко к распределению вероятностей вy_true
? Мы можем использовать кросс-энтропийную потерю для измерения ошибки.Мы можем вычислить кросс-энтропийную потерю построчно и посмотреть результаты. Ниже мы видим, что тренировочный экземпляр 1 имеет потерю 0,479, в то время как обучающий экземпляр 2 имеет более высокую потерю 1.200. Этот результат имеет смысл, поскольку в нашем примере выше
y_hat_softmax
показано, что наибольшая вероятность для обучающего экземпляра 1 была для «класса 2», который соответствует обучающему экземпляру 1 вy_true
; однако прогноз для обучающего экземпляра 2 показал наибольшую вероятность для «класса 1», который не соответствует истинному классу «класса 3».То, что мы действительно хотим, это общая потеря по всем тренировочным экземплярам. Таким образом, мы можем вычислить:
Использование softmax_cross_entropy_with_logits ()
Вместо этого мы можем вычислить общую кросс-энтропийную потерю, используя
tf.nn.softmax_cross_entropy_with_logits()
функцию, как показано ниже.Обратите внимание, что
total_loss_1
иtotal_loss_2
дают по существу эквивалентные результаты с некоторыми небольшими различиями в самых последних цифрах. Тем не менее, вы также можете использовать второй подход: он занимает на одну строку кода меньше и накапливает меньше числовых ошибок, потому что softmax выполняется для вас внутриsoftmax_cross_entropy_with_logits()
.источник
M = tf.random.uniform([100, 10], minval=-1.0, maxval=1.0); labels = tf.one_hot(tf.random.uniform([100], minval=0, maxval=10 , dtype='int32'), 10); tf.nn.softmax_cross_entropy_with_logits(labels=labels, logits=M) - tf.reduce_sum(-tf.nn.log_softmax(M)*tf.one_hot(labels, 10), -1)
возвращает значение, близкое к нулю, вездеtf.nn.softmax
вычисляет прямое распространение через слой softmax. Вы используете его во время оценки модели, когда вычисляете вероятности, которые выводит модель.tf.nn.softmax_cross_entropy_with_logits
вычисляет стоимость для слоя softmax. Используется только во время тренировки .Логиты - это ненормализованные логарифмические вероятности, которые выводят модель (значения выводятся до того, как к ним применяется нормализация softmax).
источник
tf.nn.softmax_cross_entropy_with_logits
состоит в том, чтобы оценить, насколько модель отклоняется от золотых меток, а не обеспечить нормализованный результат.tf.nn.sparse_softmax_cross_entropy_with_logits
. Чтобы получить вероятности используйтеtf.nn.softmax
.Приведенных выше ответов достаточно для описания задаваемого вопроса.
Кроме того, Tensorflow оптимизировал операцию применения функции активации, а затем расчета стоимости с использованием собственной активации, за которой следуют функции стоимости. Следовательно, это хорошая практика для использования:
tf.nn.softmax_cross_entropy()
болееtf.nn.softmax(); tf.nn.cross_entropy()
Вы можете найти заметную разницу между ними в ресурсоемкой модели.
источник
tf.nn.softmax
а затемtf.losses.softmax_cross_entropy
?То, что когда-либо идет,
softmax
является logit, это то, что Дж. Хинтон повторяет в видеофильмах Coursera все время.источник
Совместимый ответ Tensorflow 2.0 : объяснения
dga
иstackoverflowuser2010
очень подробные сведения о Logits и связанных с ними функциях.Все эти функции, при использовании в,
Tensorflow 1.x
будут работать нормально, но если вы перенесете свой код из1.x (1.14, 1.15, etc)
в2.x (2.0, 2.1, etc..)
, использование этих функций приведет к ошибке.Следовательно, указание совместимых вызовов 2.0 для всех функций, которые мы обсуждали выше, если мы перейдем
1.x to 2.x
, на благо сообщества.Функции в 1.x :
tf.nn.softmax
tf.nn.softmax_cross_entropy_with_logits
tf.nn.sparse_softmax_cross_entropy_with_logits
Соответствующие функции при миграции с 1.x на 2.x :
tf.compat.v2.nn.softmax
tf.compat.v2.nn.softmax_cross_entropy_with_logits
tf.compat.v2.nn.sparse_softmax_cross_entropy_with_logits
Для получения дополнительной информации о миграции с 1.x на 2.x, пожалуйста, обратитесь к этому Руководству по миграции .
источник
Еще одна вещь, которую я определенно хотел бы выделить, так как logit - это просто необработанный вывод, обычно вывод последнего слоя. Это может быть и отрицательным значением. Если мы будем использовать его для оценки «кросс-энтропии», как указано ниже:
тогда это не сработает. Как лог-ве не определен. Таким образом, с помощью активации Softmax, эта проблема будет решена.
Это мое понимание, пожалуйста, поправьте меня, если я ошибаюсь.
источник