From 0b20c8d2e2da734077dc43bc80d241d004c75424 Mon Sep 17 00:00:00 2001 From: Dominic Jack Date: Sun, 26 Nov 2023 12:08:30 +1000 Subject: [PATCH] Fixed layer.losses such that it recurses into sublayer losses (#18828) * Fixed layer.losses such that it recurses into sublayer losses * moved recursion into sub function * moved recursion to losses property --- keras/layers/layer.py | 4 ++-- keras/layers/layer_test.py | 6 ++++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/keras/layers/layer.py b/keras/layers/layer.py index abf345b4f4a..39fd87e5971 100644 --- a/keras/layers/layer.py +++ b/keras/layers/layer.py @@ -1073,9 +1073,9 @@ def _get_own_losses(self): @property def losses(self): - """List of scalar losses added via `add_loss()` during layer call.""" + """List of scalar losses from `add_loss`, regularizers and sublayers.""" losses = self._get_own_losses() - for layer in self._layers: + for layer in self._flatten_layers(include_self=False): losses.extend(layer._get_own_losses()) weight_regularization_losses = [] for v in self.trainable_weights: diff --git a/keras/layers/layer_test.py b/keras/layers/layer_test.py index 2075150946b..1f7fa0e006a 100644 --- a/keras/layers/layer_test.py +++ b/keras/layers/layer_test.py @@ -328,6 +328,12 @@ def call(self, x): self.assertLen(model.losses, 1) self.assertAllClose(model.losses[0], 1.0) + # It works recursively in nested models + model = models.Sequential([model]) + model(np.ones((1,))) + self.assertLen(model.losses, 1) + self.assertAllClose(model.losses[0], 1.0) + def test_training_arg_value_resolution(self): # Check that even if `training` is not passed # to an inner layer, the outer value gets propagated