diff --git a/keras/src/models/cloning.py b/keras/src/models/cloning.py index f2b88faaa58..30bc8940bd4 100644 --- a/keras/src/models/cloning.py +++ b/keras/src/models/cloning.py @@ -323,7 +323,15 @@ def _clone_sequential_model(model, clone_function, input_tensors=None): name=input_name, ) new_layers = [inputs] + new_layers - return Sequential(new_layers, name=model.name, trainable=model.trainable) + cloned_model = Sequential( + new_layers, name=model.name, trainable=model.trainable + ) + + # If model compiled already then set same to cloned model + if model.compiled: + compiled_config = model.get_compile_config() + cloned_model.compile_from_config(compiled_config) + return cloned_model def _clone_functional_model( @@ -405,5 +413,7 @@ def operation_fn(layer): # class than the original. However various existing models rely # on this behavior, so we keep it. new_model = Functional(input_tensors, output_tensors, name=model.name) - + if model.compiled: + compiled_config = model.get_compile_config() + new_model.compile_from_config(compiled_config) return new_model diff --git a/keras/src/models/cloning_test.py b/keras/src/models/cloning_test.py index 7a1fd14ad22..b7e57679859 100644 --- a/keras/src/models/cloning_test.py +++ b/keras/src/models/cloning_test.py @@ -242,3 +242,12 @@ def clone_function(layer): if isinstance(l2, layers.Dense): self.assertFalse(hasattr(l1, "flag")) self.assertTrue(hasattr(l2, "flag")) + + def test_compiled_model_cloning(self): + model = models.Sequential() + model.add(layers.Input((3,))) + model.add(layers.Dense(5, activation="relu")) + model.add(layers.Dense(1, activation="sigmoid")) + model.compile(optimizer="adam", loss="binary_crossentropy") + cloned_model = clone_model(model) + self.assertEqual(model.compiled, cloned_model.compiled)