Единичная потеря для нескольких выходов

Я хотел бы создать нейронную сеть в Keras / Tensorflow с несколькими выходами. Я хотел бы создать ЕДИННУЮ функцию потерь, которая учитывает все выходы и соответственно вычисляет потери. Мне нужно это сделать, потому что выходы связаны друг с другом. Как я могу этого добиться? Я читал о объединении всех выходных данных в один плотный слой, а затем о вычислении потерь для этого слоя. Есть ли еще более удобный способ добиться единой потери для нескольких выходов?

Я думаю о чем-то вроде:

def my_custom_loss(y_true_0, ..., y_true_n, y_pred_0, ..., y_pred_n):
   return something

y_true_0, ..., y_true_n и y_pred_0, ..., y_pred_n

должны быть истинными / прогнозируемыми выходами n выходных (плотных) слоев.


person lenngro    schedule 13.11.2019    source источник


Ответы (1)


Вы можете реализовать функции потерь в зависимости от характера ваших переменных. Некоторые из стандартных приведены ниже:

Если это просто числа (а не вероятности): потеря MSE

def my_custom_loss(y_true_0, ..., y_true_n, y_pred_0, ..., y_true_n):
   y_true = tf.stack([y_true_0,...y_true_n], axis=0)
   y_pred = tf.stack([y_pred_0,...y_pred_n], axis=0)
   something = tf.losses.mean_squared_error(y_true, y_pred)
   return something

ИЛИ Абсолютная потеря разницы

def my_custom_loss(y_true_0, ..., y_true_n, y_pred_0, ..., y_true_n):
   y_true = tf.stack([y_true_0,...y_true_n], axis=0)
   y_pred = tf.stack([y_pred_0,...y_pred_n], axis=0)
   something = tf.losses.absolute_difference(y_true, y_pred)
   return something

Если это один из горячих векторов (допустимые вероятности):

def my_custom_loss(y_true_0, ..., y_true_n, y_pred_0, ..., y_true_n):
   y_true = tf.stack([y_true_0,...y_true_n], axis=0)
   y_pred = tf.stack([y_pred_0,...y_pred_n], axis=0)
   something = tf.reduce_mean(tf.keras.losses.binary_crossentropy(y_true, y_pred))
   return something

Если они нули и единицы (недействительные вероятности):

def my_custom_loss(y_true_0, ..., y_true_n, y_pred_0, ..., y_true_n):
   y_true = tf.stack([y_true_0,...y_true_n], axis=0)
   y_pred = tf.stack([y_pred_0,...y_pred_n], axis=0)
   something = tf.reduce_mean(tf.keras.losses.binary_crossentropy(y_true, y_pred), from_logits=True)
   return something

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

person learner    schedule 13.11.2019
comment
спасибо, но это не то, что я искал. вопрос в том, как я могу получить доступ к нескольким выходам в одной функции потерь. - ›где взять все y_true_0, ..., y_true_n / y_pred_0, ..., y_pred_n от - person lenngro; 13.11.2019
comment
Разве я не хотел бы создать функцию ЕДИНСТВЕННЫХ потерь, которая учитывает все выходы и соответственно вычисляет потери. имел ввиду это? - person learner; 13.11.2019
comment
возможно, мне стоит уточнить: у меня есть сеть с несколькими выходами (›1 выходной слой). есть ли способ собрать логиты всех выходных слоев в одной функции потерь - person lenngro; 13.11.2019
comment
хорошо, теперь я запутался, вам нужна функция потерь или все выходы? - person learner; 13.11.2019
comment
Извините за недопонимание. Мне нужны все выходы как входы для одной функции. обычно каждый выходной слой сети имеет свою функцию потерь. - person lenngro; 13.11.2019