Keras deviance пользовательские потери - PullRequest
0 голосов
/ 26 марта 2019

Я пытаюсь использовать отклонение в качестве пользовательской функции потерь для оптимизации нейронной сети с помощью keras. Я попробовал это:

#building model
model = keras.Sequential()
model.add(Dense(10, input_dim = 6, activation = "relu"))
model.add(Dense(5, activation = "relu"))
model.add(Dense(1, activation = "sigmoid"))

#DEF CUSTOM LOSS
def custom_loss():
    def loss(y_true, y_pred):
        return (2. *(KB.log(y_true) - KB.log(y_pred)))
    return loss


model.compile(loss = custom_loss(), optimizer = 'sgd')
model.fit(factorsTrain, yTrain, epochs = 2)

Но это дает -inf как потерю, так что я думаю, что она вообще не работает должным образом, есть что-то, что я сделал не так?

Редактировать: я изменил активацию на экспоненциальную в последнем слое, чтобы значения были от 0 до 1. Я также заметил, что, поскольку некоторые из моих y_true (большинство из них фактически) равны 0, я изменил функцию потерь на эту (также добавлен эпсилон 1e-07, чтобы убедиться, что я не вычисляю ln (0):

#DEF CUSTOM LOSS
def custom_loss():
    def loss(y_true, y_pred):

        return (( KB.sqrt( KB.square(2 * (KB.log(y_true + KB.epsilon()) -    KB.log(y_pred + KB.epsilon())) ))))
    return loss

Теперь я больше не получаю -inf, но вместо этого я получаю NaN

1 Ответ

0 голосов
/ 26 марта 2019

Удалось исправить это, немного изменив формулу, чтобы заставить значения в логах быть> = 0

def Deviance_loss():
    def loss(y_true, y_pred):
        y_true = KB.max(y_true, 0)
        return (KB.sqrt(KB.square( 2 * KB.log(y_true + KB.epsilon()) - KB.log(y_pred))))
    return loss
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...