Чрезвычайно странное поведение моей собственной функции потерь, записанной в кератах (всегда выводить похожие значения) - PullRequest
0 голосов
/ 07 мая 2019

Я реализую алгоритм глубокого обучения на основе 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).


1 Ответ

0 голосов
/ 08 мая 2019

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

def my_loss_function(y_true, y_pred):
    diff = y_pred[1:,:] - y_pred[:-1, :] 
    order_loss = -K.sum(K.log(K.sigmoid(diff)+K.epsilon()))

    # anything you like to print
    print_op = tf.print("\nDebug : ", diff, order_loss, K.get_variable_shape(y_pred))  
    with tf.control_dependencies([print_op]): # this will force the print_op to be run
        return K.identity(order_loss)
    #return K.identity(order_loss)

Надеюсь, вам будет полезно посмотреть, соответствуют ли формы и значения ожидаемым, и обнаружите ли вы какие-либо расхождения. Дайте мне знать, если найдете что-нибудь подозрительное, и тогда мы сможем это сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...