Source code for phygnn.utilities.loss_metrics

# -*- coding: utf-8 -*-
"""
Loss metrics for PhyGNN
"""
import tensorflow as tf
from tensorflow.keras.losses import binary_crossentropy as tf_bx


[docs]def binary_crossentropy(*args): """Binary crossentropy loss from keras""" loss = tf_bx(*args) return tf.reduce_mean(loss)
[docs]def mae(y_true, y_predicted): """Calculate the Mean Absolute Error (MAE)""" err = y_predicted - y_true err = tf.boolean_mask(err, ~tf.math.is_nan(err)) err = tf.boolean_mask(err, tf.math.is_finite(err)) err = tf.reduce_mean(tf.abs(err)) return err
[docs]def mse(y_true, y_predicted): """Calculate the Mean Square Error (MSE)""" err = y_predicted - y_true err = tf.boolean_mask(err, ~tf.math.is_nan(err)) err = tf.boolean_mask(err, tf.math.is_finite(err)) err = tf.reduce_mean(tf.square(err)) return err
[docs]def mbe(y_true, y_predicted): """Calculate the (absolute) Mean Bias Error (MBE). Note that this is actually abs(mbe) so that the NN doesnt predict a large negative mbe. """ err = y_predicted - y_true err = tf.boolean_mask(err, ~tf.math.is_nan(err)) err = tf.boolean_mask(err, tf.math.is_finite(err)) err = tf.abs(tf.reduce_mean(err)) return err
[docs]def relative_mae(y_true, y_predicted): """Calculate the relative Mean Absolute Error (MAE)""" err = mae(y_predicted, y_true) err /= tf.abs(tf.reduce_mean(y_true)) return err
[docs]def relative_mse(y_true, y_predicted): """Calculate the relative Mean Squared Error (MSE)""" err = mse(y_predicted, y_true) err /= tf.abs(tf.reduce_mean(y_true)) return err
[docs]def relative_mbe(y_true, y_predicted): """Calculate the relative Mean Bias Error (MBE) Note that this is actually abs(relative_mbe) so that the NN doesnt predict a large negative mbe. """ err = mbe(y_predicted, y_true) err /= tf.abs(tf.reduce_mean(y_true)) return err
METRICS = {'mae': mae, 'mbe': mbe, 'mse': mse, 'relative_mae': relative_mae, 'relative_mbe': relative_mbe, 'relative_mse': relative_mse, 'binary_crossentropy': binary_crossentropy, }