Я пытаюсь принять немасштабированное отклонение Пуассона как обычную потерю.Я работал над этим в течение некоторого времени, и я уже исправил большинство проблем, но есть последняя, от которой я не могу избавиться, и я хотел бы знать, знает ли кто-нибудь из вас, откуда это может исходить.
Когда я подгоняю модель, используя свою нестандартную потерю, она начинается идеально, давая мне ожидаемое отклонение, но после 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).