""" Keras loss functions will choke on NaN inputs, which we'll often have for
unspecified inputs. These are just a couple simple loss functions that mask NaN
values in both the test and predicted tensors when computing the cost. """
from nfp.frameworks import tf
[docs]def masked_mean_squared_error(y_true, y_pred):
mask = tf.math.is_finite(y_true)
y_true_mask = tf.boolean_mask(tensor=y_true, mask=mask)
y_pred_mask = tf.boolean_mask(tensor=y_pred, mask=mask)
return tf.math.reduce_mean(tf.math.square(y_pred_mask - y_true_mask))
[docs]def masked_mean_absolute_error(y_true, y_pred):
mask = tf.math.is_finite(y_true)
y_true_mask = tf.boolean_mask(tensor=y_true, mask=mask)
y_pred_mask = tf.boolean_mask(tensor=y_pred, mask=mask)
return tf.math.reduce_mean(tf.math.abs(y_pred_mask - y_true_mask))
[docs]def masked_log_cosh(y_true, y_pred):
mask = tf.math.is_finite(y_true)
y_true_mask = tf.boolean_mask(tensor=y_true, mask=mask)
y_pred_mask = tf.boolean_mask(tensor=y_pred, mask=mask)
return tf.keras.losses.logcosh(y_pred_mask, y_true_mask)