Keras deviance custom loss

I am trying to use deviance in order to optimize my network. Note that my $$y_{true}$$ values are equal to 0 more than in 90% of cases (can also be 1 or 2).

The deviance is calculated as : $$2 \times (log(y_{true}) - log(y_{pred}))$$

The problem in my case is that $$log(y_{true})$$ when $$y_{true}= 0$$ gives me $$-\infty$$.

I derivated the deviance formula in my case (poisson unscaled deviance) and got this result :

• If $$y_{true} = 0$$, then deviance is : $$2D \times y_{pred}$$ where $$D$$ is a feature of my data.
• If $$y_{true} \ne 0$$, then deviance is : $$2D \times (y_{true} \times ln(y_{true}) - y_{true} \times ln(y_{pred}) - y_{true} + y_{pred})$$

This is the loss i came up with :

def custom_loss(data, y_pred):

y_true = data[:, 0]
d = data[:, 1:]
# condition
mask2 = keras.backend.not_equal(y_true, 0) #i.e. y_true != 0
mask2 = KB.cast(mask2, KB.floatx())
# returns 0 when y_true =0, 1 otherwise
#calculate loss using d...
loss_value = 2 * d * y_pred + mask2 * (2 * d * y_true * KB.log(y_true) + 2 * d * y_true * KB.log(y_pred) - 2 * d * y_true)
return loss_value

Using a mask in order to only compute logs when $$y_{true}$$ is different from 0. I don't think the formula is wrong but it still gives me NaN as loss result...

If anyone knows what is the matter here, or knows about a way to get around this problem i'd be very thankful.