Как преобразовать пользовательскую функцию потерь с логитами, встроенными в тензорный поток, в керасы? - PullRequest
0 голосов
/ 01 июля 2019

У меня есть функция потерь, встроенная в tenorflow, для входа нужны логиты и метки:

   def median_weight_class_loss(labels, logits):
       epsilon = tf.constant(value=1e-10)
       logits = logits + epsilon
       softmax = tf.nn.softmax(logits)
       #this is just the number of samples in each class in my dataset divided by the sum of samples 10015.
       weight_sample = np.array([1113,6705,514,327,1099,115,142])/10015
       weight_sample = 0.05132302/weight_sample
       xent = -tf.reduce_sum(tf.multiply(labels * tf.log(softmax + epsilon), weight_sample), axis=1)
       return xent

Проблема в том, что функции потерь в керасе находятся в другом формате:

   custom_loss(y_true, y_pred)

он использовал y_true, y_pred в качестве входных данных,

Я нашел способ получить логиты в керасе, используя линейную активацию вместо softmax в последнем слое в моей модели.

   model.add(Activation('linear'))

Но мне нужномоя модель для активации softmax на последнем слое, как вы думаете, решение?спасибо.

1 Ответ

0 голосов
/ 01 июля 2019

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

def median_weight_class_loss(y_true, y_pred):
       epsilon = tf.constant(value=1e-10)
       weight_sample = np.array([1113,6705,514,327,1099,115,142])/10015
       weight_sample = 0.05132302/weight_sample
       xent = -tf.reduce_sum(tf.multiply(y_true * tf.log(y_pred + epsilon), weight_sample), axis=1)
       return xent
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...