Керас девиация пользовательские потери возвращает NA после n итераций - PullRequest
0 голосов
/ 03 мая 2019

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

Когда я подгоняю модель, используя свою нестандартную потерю, она начинается идеально, давая мне ожидаемое отклонение, но после n-периодов она начинает давать NaN в качестве вывода и никогда не возвращается к реальному числу.Я не могу сказать, сколько эпох это занимает, так как это довольно случайно и происходит в середине эпохи.

Вот два аналогичных пользовательских убытка, которые дают одинаковый результат:

def custom_loss3(data, y_pred):
    y_true = data[:, 0]
    d = data[:, 1]

    lnYTrue = KB.switch(KB.equal(y_true, 0), KB.zeros_like(y_true), KB.log(y_true))
    lnYPred = KB.switch(KB.equal(y_pred, 0), KB.zeros_like(y_pred), KB.log(y_pred))
    loss_value = 2 * d * (y_true * lnYTrue - y_true * lnYPred[:, 0] - y_true + y_pred[:, 0])
    return loss_value

def deviance(data, y_pred):
    y_true = data[:, 0]
    d = data[:, 1]

    lnY = KB.log(y_true)
    bool1 = KB.equal(y_true, 0)
    zeros = KB.zeros_like(y_true)
    lnY = KB.switch(bool1, zeros, lnY)

    lnYp = KB.log(y_pred)
    bool2 = KB.equal(y_pred, 0)
    zeross = KB.zeros_like(y_pred)
    lnYp = KB.switch(bool2, zeross, lnYp)

    loss = 2 * d * (y_true * lnY - y_true * lnYp[:, 0] - y_true + y_pred[:, 0])
    return KB.sum(loss)

Примечание: y_true принимает значения от 0 до ~ 100, но большую часть времени будет равняться 0. Поэтому япопробуйте использовать switch в случае log (0).

...