Weird behaviour in tensorflow metric

Question:

I have created a tensorflow metric as seen below:

def AttackAcc(y_true, y_pred):
    r = tf.random.uniform(shape=(), minval=0, maxval=11, dtype=tf.int32)
    if tf.math.greater(r,tf.constant(5) ):
      return tf.math.equal( tf.constant(0.6) ,  tf.constant(0.2) )
    else:
      return tf.math.equal( tf.constant(0.6) ,  tf.constant(0.6) )

The metric is added to the model.compile as :

metrics=[AttackAcc]

This should return 0 half of the time and 1 in the other half. SO while training my model i should see a value for this metric of around 0.5.
However it is always 0.
Any ideas about why?

Asked By: Los

||

Answers:

It looks like you are comparing two constants and they will always not be equal. Try BinaryAccuracy and use your input variables to update the state.

def AttackAcc(y_true, y_pred):
    r = tf.random.uniform(shape=(), minval=0, maxval=11, dtype=tf.int32)
    acc_metric = tf.keras.metrics.BinaryAccuracy()
    acc_metric.update_state(y_true, y_pred)
    if tf.math.greater(r, tf.constant(5)):
        return acc_metric.result()
    else:
        return 1 - acc_metric.result()
Answered By: iohans