Потеря кераса всегда 0,0000e + 00 - PullRequest
0 голосов
/ 07 апреля 2020

Я реализовал MLP с пользовательской функцией потерь, вот код:

def custom_loss(groups_id_count):
  print('Computing loss...')
  def listnet_loss(real_labels, predicted_labels):
    start_range = 0
    for group in groups_id_count:
      end_range = start_range + group[1]
      batch_real_labels = real_labels[start_range:end_range]
      batch_predicted_labels = predicted_labels[start_range:end_range]
      loss = -K.sum(get_top_one_probability(batch_real_labels)) * tf.math.log(get_top_one_probability(batch_predicted_labels))
      start_range = end_range
    print('loss: ', loss)
    return loss
  return listnet_loss

Печатная эпоха потерь по эпохам всегда равна 0.0000e+00, а оператор print для переменной loss равен Tensor("listnet_loss/mul_24:0", shape=(None, None), dtype=float32).

Это функция get_top_one_probability:

def get_top_one_probability(vector):
  return (K.exp(vector) / K.sum(K.exp(vector)))

ОБНОВЛЕНИЕ :

Выход для get_top_one_probability(batch_predicted_labels) всегда:

Tensor("listnet_loss/truediv_36:0", shape=(None, 1), dtype=float32)

Выход real_labels:

Tensor("ExpandDims:0", shape=(None, 1), dtype=float32)

Выход batch_real_labels и batch_predicted_labels всегда:

Tensor("listnet_loss/strided_slice:0", shape=(None, 1), dtype=float32)

ОБНОВЛЕНИЕ 2 :

Использование K.shape(real_labels) Я заметил, что форма (2,), но я ожидаю, что форма соответствует числу меток, переданных в функцию fit. Это неправильно?

Что-то не так с моей функцией потери? Заранее спасибо.

1 Ответ

0 голосов
/ 07 апреля 2020

Мне кажется, проблема в области действия переменной loss. Вы также не добавляете потери при каждой итерации l oop.

Попробуйте следующий код:

def listnet_loss(real_labels, predicted_labels):
    start_range = 0
    loss = 0
    for group in groups_id_count:
      end_range = start_range + group[1]
      batch_real_labels = real_labels[start_range:end_range]
      batch_predicted_labels = predicted_labels[start_range:end_range]
      loss += -K.sum(get_top_one_probability(batch_real_labels)) * tf.math.log(get_top_one_probability(batch_predicted_labels))
      start_range = end_range
    print('loss: ', loss)
    return loss
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...