Как получить прогноз при вычислении функции потерь в сверточной нейронной сети (тензор потока)? - PullRequest
0 голосов
/ 02 февраля 2019

Я построил сверточную нейронную сеть с тензорным потоком, выполнив следующие шаги: https://www.tensorflow.org/tutorials/estimators/cnn

Я хочу вычислить потери с помощью своей собственной функции потерь и, следовательно, мне нужно получить прогнозируемые вероятности каждого класса в каждой тренировкешаг.Из учебника Tensorflow я знаю, что я могу получить эти возможности с помощью «tf.nn.softmax (logits)», однако это возвращает тензор, и я не знаю, как извлечь фактические возможности из этого тензора.Может кто-нибудь сказать мне, как я могу получить эти возможности, чтобы я мог вычислить мою функцию потерь?

1 Ответ

0 голосов
/ 02 февраля 2019

Вот как вы вычисляете softmax и получаете вероятности впоследствии:

# Probabities for each element in the batch for each class.
softmax = tf.nn.softmax(logits, axis=1)
# For each element in the batch return the element that has the maximal probability
predictions = tf.argmax(softmax, axis=1)

Однако, обратите внимание, что вам не нужны прогнозы для вычисления функции потерь, вам нужны действительные вероятности,Если вы хотите вычислить другие метрики, вы можете использовать прогнозы (метрики, такие как точность, точность, отзыв и т. Д.).Softmax Tensor, содержит фактические вероятности для каждого из ваших классов.Например, предполагая, что у вас есть 2 элемента в пакете, и вы пытаетесь предсказать один из трех классов, softmax даст вам следующее:

# Logits with random numbers
logits = np.array([[24, 23, 50], [50, 30, 32]], dtype=np.float32)
tf.nn.softmax(logits, axis=1)
# The softmax returns
# [[5.1090889e-12 1.8795289e-12 1.0000000e+00]
#  [1.0000000e+00 2.0611537e-09 1.5229979e-08]]
# If we sum the probabilites for each batch they should sum up to one
tf.reduce_sum(softmax, axis=1)
# [1. 1.]

В зависимости от того, как вы представляете свою функцию потерьчтобы быть это должно быть правильно:

first_second = tf.nn.l2_loss(softmax[0] - softmax[1])
first_third = tf.nn.l2_loss(softmax[0] - softmax[2])
divide_and_add_m = tf.divide(first_second, first_third) + m
loss = tf.maximum(0.0, 1 - tf.reduce_sum(divide_and_add_m))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...