0

I have the folowing custom loss:

def Loss(y_true,y_pred):
    y_pred = relu(y_pred)
    z = k.maximum(y_true, y_pred)
    y_pred_negativo = Lambda(lambda x: -x)(y_pred)
    w = k.abs(add([y_true, y_pred_negativo])) 
    if k.sum(z) == 0.0:
        erro = 0.0
    elif k.sum(y_true) == 0.0 and k.sum(z) != 0:
        erro = 100
    else:
        erro = (k.sum(w)/k.sum(z))*100.0
    return erro

However, as you can see, I'm mixing numpy with tensor conditional. Therefore, I have to write this conditional in a tensor format.

if k.sum(z) == 0.0:
    erro = 0.0
elif k.sum(y_true) == 0.0 and k.sum(z) != 0:
    erro = 100
else:
    erro = (k.sum(w)/k.sum(z))*100.0

I know how to do it for if else format, but not for this much of the conditions. Thanks!

Marlon Teixeira
  • 334
  • 1
  • 14

1 Answers1

0

Here comes my own definition of conditional statement in terms of keras.

def energia_perdida_tensorial(y_true,y_pred):
    y_pred = relu(y_pred)
    z = k.maximum(y_true, y_pred)
    y_pred_negativo = Lambda(lambda x: -x)(y_pred)
    w = k.abs(add([y_true, y_pred_negativo])) 
    erro = k.switch(k.equal(k.sum(z), 0.0), lambda: 0.0, lambda: (k.sum(w)/k.sum(z))*100.0)
    erro = k.switch(k.all([k.equal(k.sum(y_true), 0), k.greater(k.sum(z), 0)], axis=0), lambda: 100.0, lambda: erro)
    return erro

If is there anything wrong or a more elegant way of defining it, please make your contribuition.

Marlon Teixeira
  • 334
  • 1
  • 14