From 6bc2571241a600681f8a157c20e29858c2e1546a Mon Sep 17 00:00:00 2001 From: Surya Prakash Mishra Date: Wed, 28 Jul 2021 15:18:15 +0530 Subject: [PATCH 1/3] Remove all the casts of y_true to y_pred data type --- keras/losses.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/keras/losses.py b/keras/losses.py index 82c98f0d223b..b82e4d1c73f9 100644 --- a/keras/losses.py +++ b/keras/losses.py @@ -1200,7 +1200,7 @@ def mean_squared_error(y_true, y_pred): Mean squared error values. shape = `[batch_size, d0, .. dN-1]`. """ y_pred = tf.convert_to_tensor(y_pred) - y_true = tf.cast(y_true, y_pred.dtype) + return backend.mean(tf.math.squared_difference(y_pred, y_true), axis=-1) @@ -1328,7 +1328,7 @@ def mean_absolute_error(y_true, y_pred): Mean absolute error values. shape = `[batch_size, d0, .. dN-1]`. """ y_pred = tf.convert_to_tensor(y_pred) - y_true = tf.cast(y_true, y_pred.dtype) + return backend.mean(tf.abs(y_pred - y_true), axis=-1) @@ -1413,7 +1413,7 @@ def mean_squared_logarithmic_error(y_true, y_pred): Mean squared logarithmic error values. shape = `[batch_size, d0, .. dN-1]`. """ y_pred = tf.convert_to_tensor(y_pred) - y_true = tf.cast(y_true, y_pred.dtype) + first_log = tf.math.log(backend.maximum(y_pred, backend.epsilon()) + 1.) second_log = tf.math.log(backend.maximum(y_true, backend.epsilon()) + 1.) return backend.mean( @@ -1470,7 +1470,7 @@ def squared_hinge(y_true, y_pred): Squared hinge loss values. shape = `[batch_size, d0, .. dN-1]`. """ y_pred = tf.convert_to_tensor(y_pred) - y_true = tf.cast(y_true, y_pred.dtype) + y_true = _maybe_convert_labels(y_true) return backend.mean( tf.square(tf.maximum(1. - y_true * y_pred, 0.)), axis=-1) @@ -1503,7 +1503,7 @@ def hinge(y_true, y_pred): Hinge loss values. shape = `[batch_size, d0, .. dN-1]`. """ y_pred = tf.convert_to_tensor(y_pred) - y_true = tf.cast(y_true, y_pred.dtype) + y_true = _maybe_convert_labels(y_true) return backend.mean(tf.maximum(1. - y_true * y_pred, 0.), axis=-1) @@ -1536,7 +1536,7 @@ def categorical_hinge(y_true, y_pred): Categorical hinge loss values. """ y_pred = tf.convert_to_tensor(y_pred) - y_true = tf.cast(y_true, y_pred.dtype) + pos = tf.reduce_sum(y_true * y_pred, axis=-1) neg = tf.reduce_max((1. - y_true) * y_pred, axis=-1) zero = tf.cast(0., y_pred.dtype) @@ -1608,7 +1608,7 @@ def log_cosh(y_true, y_pred): Logcosh error values. shape = `[batch_size, d0, .. dN-1]`. """ y_pred = tf.convert_to_tensor(y_pred) - y_true = tf.cast(y_true, y_pred.dtype) + def _logcosh(x): return x + tf.math.softplus(-2. * x) - tf.cast( @@ -1651,7 +1651,7 @@ def categorical_crossentropy(y_true, Categorical crossentropy loss value. """ y_pred = tf.convert_to_tensor(y_pred) - y_true = tf.cast(y_true, y_pred.dtype) + label_smoothing = tf.convert_to_tensor( label_smoothing, dtype=backend.floatx()) @@ -1734,7 +1734,7 @@ def sparse_categorical_crossentropy(y_true, y_pred, from_logits=False, axis=-1): Sparse categorical crossentropy loss value. """ y_pred = tf.convert_to_tensor(y_pred) - y_true = tf.cast(y_true, y_pred.dtype) + return backend.sparse_categorical_crossentropy( y_true, y_pred, from_logits=from_logits, axis=axis) @@ -1795,7 +1795,7 @@ def binary_crossentropy(y_true, Binary crossentropy loss value. shape = `[batch_size, d0, .. dN-1]`. """ y_pred = tf.convert_to_tensor(y_pred) - y_true = tf.cast(y_true, y_pred.dtype) + label_smoothing = tf.convert_to_tensor( label_smoothing, dtype=backend.floatx()) @@ -1882,7 +1882,7 @@ def kl_divergence(y_true, y_pred): TypeError: If `y_true` cannot be cast to the `y_pred.dtype`. """ y_pred = tf.convert_to_tensor(y_pred) - y_true = tf.cast(y_true, y_pred.dtype) + y_true = backend.clip(y_true, backend.epsilon(), 1) y_pred = backend.clip(y_pred, backend.epsilon(), 1) return tf.reduce_sum(y_true * tf.math.log(y_true / y_pred), axis=-1) @@ -1918,7 +1918,7 @@ def poisson(y_true, y_pred): InvalidArgumentError: If `y_true` and `y_pred` have incompatible shapes. """ y_pred = tf.convert_to_tensor(y_pred) - y_true = tf.cast(y_true, y_pred.dtype) + return backend.mean( y_pred - y_true * tf.math.log(y_pred + backend.epsilon()), axis=-1) From ca3da0cbac39799fc183dec704765ed738978cb2 Mon Sep 17 00:00:00 2001 From: Surya Prakash Mishra Date: Thu, 29 Jul 2021 00:14:56 +0530 Subject: [PATCH 2/3] Removed cast only in sparse categorical cross entropy loss --- keras/losses.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/keras/losses.py b/keras/losses.py index b82e4d1c73f9..d5f8ce4f4b31 100644 --- a/keras/losses.py +++ b/keras/losses.py @@ -1200,7 +1200,7 @@ def mean_squared_error(y_true, y_pred): Mean squared error values. shape = `[batch_size, d0, .. dN-1]`. """ y_pred = tf.convert_to_tensor(y_pred) - + y_true = tf.cast(y_true, y_pred.dtype) return backend.mean(tf.math.squared_difference(y_pred, y_true), axis=-1) @@ -1328,7 +1328,7 @@ def mean_absolute_error(y_true, y_pred): Mean absolute error values. shape = `[batch_size, d0, .. dN-1]`. """ y_pred = tf.convert_to_tensor(y_pred) - + y_true = tf.cast(y_true, y_pred.dtype) return backend.mean(tf.abs(y_pred - y_true), axis=-1) @@ -1413,7 +1413,7 @@ def mean_squared_logarithmic_error(y_true, y_pred): Mean squared logarithmic error values. shape = `[batch_size, d0, .. dN-1]`. """ y_pred = tf.convert_to_tensor(y_pred) - + y_true = tf.cast(y_true, y_pred.dtype) first_log = tf.math.log(backend.maximum(y_pred, backend.epsilon()) + 1.) second_log = tf.math.log(backend.maximum(y_true, backend.epsilon()) + 1.) return backend.mean( @@ -1470,7 +1470,7 @@ def squared_hinge(y_true, y_pred): Squared hinge loss values. shape = `[batch_size, d0, .. dN-1]`. """ y_pred = tf.convert_to_tensor(y_pred) - + y_true = tf.cast(y_true, y_pred.dtype) y_true = _maybe_convert_labels(y_true) return backend.mean( tf.square(tf.maximum(1. - y_true * y_pred, 0.)), axis=-1) @@ -1503,7 +1503,7 @@ def hinge(y_true, y_pred): Hinge loss values. shape = `[batch_size, d0, .. dN-1]`. """ y_pred = tf.convert_to_tensor(y_pred) - + y_true = tf.cast(y_true, y_pred.dtype) y_true = _maybe_convert_labels(y_true) return backend.mean(tf.maximum(1. - y_true * y_pred, 0.), axis=-1) @@ -1608,7 +1608,7 @@ def log_cosh(y_true, y_pred): Logcosh error values. shape = `[batch_size, d0, .. dN-1]`. """ y_pred = tf.convert_to_tensor(y_pred) - + y_true = tf.cast(y_true, y_pred.dtype) def _logcosh(x): return x + tf.math.softplus(-2. * x) - tf.cast( @@ -1651,7 +1651,7 @@ def categorical_crossentropy(y_true, Categorical crossentropy loss value. """ y_pred = tf.convert_to_tensor(y_pred) - + y_true = tf.cast(y_true, y_pred.dtype) label_smoothing = tf.convert_to_tensor( label_smoothing, dtype=backend.floatx()) @@ -1795,7 +1795,7 @@ def binary_crossentropy(y_true, Binary crossentropy loss value. shape = `[batch_size, d0, .. dN-1]`. """ y_pred = tf.convert_to_tensor(y_pred) - + y_true = tf.cast(y_true, y_pred.dtype) label_smoothing = tf.convert_to_tensor( label_smoothing, dtype=backend.floatx()) @@ -1882,7 +1882,7 @@ def kl_divergence(y_true, y_pred): TypeError: If `y_true` cannot be cast to the `y_pred.dtype`. """ y_pred = tf.convert_to_tensor(y_pred) - + y_true = tf.cast(y_true, y_pred.dtype) y_true = backend.clip(y_true, backend.epsilon(), 1) y_pred = backend.clip(y_pred, backend.epsilon(), 1) return tf.reduce_sum(y_true * tf.math.log(y_true / y_pred), axis=-1) @@ -1918,7 +1918,7 @@ def poisson(y_true, y_pred): InvalidArgumentError: If `y_true` and `y_pred` have incompatible shapes. """ y_pred = tf.convert_to_tensor(y_pred) - + y_true = tf.cast(y_true, y_pred.dtype) return backend.mean( y_pred - y_true * tf.math.log(y_pred + backend.epsilon()), axis=-1) From f175038f932aff5af37539f6f67875021b5647db Mon Sep 17 00:00:00 2001 From: Surya Prakash Mishra Date: Thu, 29 Jul 2021 00:20:51 +0530 Subject: [PATCH 3/3] Removed cast only in sparse categorical cross entropy loss --- keras/losses.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keras/losses.py b/keras/losses.py index d5f8ce4f4b31..6ccd988b9f3c 100644 --- a/keras/losses.py +++ b/keras/losses.py @@ -1536,7 +1536,7 @@ def categorical_hinge(y_true, y_pred): Categorical hinge loss values. """ y_pred = tf.convert_to_tensor(y_pred) - + y_true = tf.cast(y_true, y_pred.dtype) pos = tf.reduce_sum(y_true * y_pred, axis=-1) neg = tf.reduce_max((1. - y_true) * y_pred, axis=-1) zero = tf.cast(0., y_pred.dtype)