Я реализую алгоритм глубокого обучения на основе CNN для обеспечения непрерывного ранжирования набора изображений.Мой план состоит в том, чтобы снабдить сеть пакетами изображений, которые уже ранжированы в правильном порядке, и оценить ошибки ранжирования в пользовательской функции потерь, надеюсь, сеть сможет узнать, как вывести относительное число, указывающее положение данного изображения.в последовательности.
Я придумал простую пользовательскую функцию потерь, как показано ниже:
def my_loss_function(y_true, y_pred):
#diff = y_pred[1:,:] - y_pred[:-1, :] //previous implementation, same problem
indx1 = tf.range(1, 128)
indx2 = tf.range(0, 127)
diff = tf.gather(y_pred, indx1) - tf.gather(y_pred, indx2)
order_loss = -K.sum(K.log(K.sigmoid(diff)+K.epsilon()))
return order_loss
Как вы можете видеть, мне действительно не нужны данные y-true, поэтому я сгенерировал фиктивныйДанные y_true просто для того, чтобы избежать ошибки проверки по keras.
Странная проблема, с которой я столкнулся, заключается в том, что эта функция потерь всегда запускается с почти одинаковым значением при запуске, даже после того, как я изменил возврат на 2*order_loss
или изменил K.sum
на K.mean
или другие функции.,На тренировках потери могут уменьшаться очень медленно и быстро вырастут.Я не мог придумать причину, которая могла бы вызвать эту проблему, кто-нибудь имел подобный опыт или знает, как решить эту проблему?
Обновление:
Даже после того, как я изменил функцию потериto:
def my_loss_function(y_true, y_pred):
diff = alpha*y_pred # alpha is a constant
order_loss = -K.sum(K.log(K.sigmoid(diff)+K.epsilon()))
return order_loss
По-прежнему та же проблема: когда я изменяю альфа-значение, вывод не изменяется соответственно.Int_shape для y_pred (none, 1).