Я реализовал 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
. Это неправильно?
Что-то не так с моей функцией потери? Заранее спасибо.