From 53a209a3c71ebdd6088fecdc9bd26138d932cc4c Mon Sep 17 00:00:00 2001 From: divyashreepathihalli Date: Mon, 6 Nov 2023 23:11:37 +0000 Subject: [PATCH 01/54] improve keras 3 detection --- keras_cv/backend/__init__.py | 9 ++++----- keras_cv/backend/config.py | 16 ++++++++++++++++ 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/keras_cv/backend/__init__.py b/keras_cv/backend/__init__.py index a22ce4ca4d..ab80280b55 100644 --- a/keras_cv/backend/__init__.py +++ b/keras_cv/backend/__init__.py @@ -26,6 +26,7 @@ from packaging.version import parse +from keras_cv.backend.config import detect_if_tensorflow_uses_keras_3 from keras_cv.backend.config import multi_backend # Keys are of the form: "module.where.attr.exists->module.where.to.alias" @@ -43,11 +44,9 @@ if multi_backend(): - import keras - - if not hasattr(keras, "__version__") or parse(keras.__version__) < parse( - "3.0" - ): + if detect_if_tensorflow_uses_keras_3(): + from tensorflow import keras + else: import keras_core as keras keras.backend.name_scope = keras.name_scope diff --git a/keras_cv/backend/config.py b/keras_cv/backend/config.py index a921639bd9..c99a566831 100644 --- a/keras_cv/backend/config.py +++ b/keras_cv/backend/config.py @@ -26,6 +26,22 @@ _keras_base_dir = "/tmp" _keras_dir = os.path.join(_keras_base_dir, ".keras") + +def detect_if_tensorflow_uses_keras_3(): + # We follow the version of keras that tensorflow is configured to use. + from tensorflow import keras + + # Note that only recent versions of keras have a `version()` function. + if hasattr(keras, "version") and keras.version().startswith("3."): + return True + + # No `keras.version()` means we are on an old version of keras. + return False + + +if detect_if_tensorflow_uses_keras_3(): + _MULTI_BACKEND = True + # Attempt to read KerasCV config file. _config_path = os.path.expanduser(os.path.join(_keras_dir, "keras_cv.json")) if os.path.exists(_config_path): From 4ebec49b756a5d9567caa6de703de5cf4586ee1e Mon Sep 17 00:00:00 2001 From: divyashreepathihalli Date: Tue, 7 Nov 2023 03:23:52 +0000 Subject: [PATCH 02/54] update __init__ --- keras_cv/backend/__init__.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/keras_cv/backend/__init__.py b/keras_cv/backend/__init__.py index ab80280b55..ea677d4162 100644 --- a/keras_cv/backend/__init__.py +++ b/keras_cv/backend/__init__.py @@ -44,9 +44,12 @@ if multi_backend(): + import keras if detect_if_tensorflow_uses_keras_3(): from tensorflow import keras - else: + elif not hasattr(keras, "__version__") or parse(keras.__version__) < parse( + "3.0" + ): import keras_core as keras keras.backend.name_scope = keras.name_scope From 6d56e6fdce64969af83ed3d86e74880630a8cbca Mon Sep 17 00:00:00 2001 From: divyashreepathihalli Date: Tue, 7 Nov 2023 03:38:47 +0000 Subject: [PATCH 03/54] update config --- keras_cv/backend/config.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/keras_cv/backend/config.py b/keras_cv/backend/config.py index c99a566831..45bccabdb8 100644 --- a/keras_cv/backend/config.py +++ b/keras_cv/backend/config.py @@ -14,6 +14,8 @@ import json import os +from packaging.version import parse + _MULTI_BACKEND = False # Set Keras base dir path given KERAS_HOME env variable, if applicable. @@ -39,6 +41,18 @@ def detect_if_tensorflow_uses_keras_3(): return False +def detect_if_keras_3(): + import keras + if hasattr(keras, "__version__") or parse(keras.__version__) == parse("3.0"): + return True + else: + return False + + +if detect_if_keras_3(): + _MULTI_BACKEND = True + + if detect_if_tensorflow_uses_keras_3(): _MULTI_BACKEND = True @@ -50,7 +64,7 @@ def detect_if_tensorflow_uses_keras_3(): _config = json.load(f) except ValueError: _config = {} - _MULTI_BACKEND = _config.get("multi_backend", _MULTI_BACKEND) + _MULTI_BACKEND = _config.gest("multi_backend", _MULTI_BACKEND) # Save config file, if possible. if not os.path.exists(_keras_dir): From 21ad140ca6264387ddffe7e2e75f3e13c80ad43f Mon Sep 17 00:00:00 2001 From: divyashreepathihalli Date: Tue, 7 Nov 2023 03:44:26 +0000 Subject: [PATCH 04/54] update config to update multibackend flag --- keras_cv/backend/config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keras_cv/backend/config.py b/keras_cv/backend/config.py index 45bccabdb8..e30e237619 100644 --- a/keras_cv/backend/config.py +++ b/keras_cv/backend/config.py @@ -43,7 +43,7 @@ def detect_if_tensorflow_uses_keras_3(): def detect_if_keras_3(): import keras - if hasattr(keras, "__version__") or parse(keras.__version__) == parse("3.0"): + if hasattr(keras, "__version__") and keras.__version__.startswith("3."): return True else: return False From 219f7435ad3b8724c4426c4a6b5ed5e5baaeffa9 Mon Sep 17 00:00:00 2001 From: divyashreepathihalli Date: Tue, 7 Nov 2023 03:54:22 +0000 Subject: [PATCH 05/54] updated spelling error --- keras_cv/backend/config.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/keras_cv/backend/config.py b/keras_cv/backend/config.py index e30e237619..e305efab82 100644 --- a/keras_cv/backend/config.py +++ b/keras_cv/backend/config.py @@ -49,12 +49,10 @@ def detect_if_keras_3(): return False -if detect_if_keras_3(): - _MULTI_BACKEND = True - - if detect_if_tensorflow_uses_keras_3(): _MULTI_BACKEND = True +elif detect_if_keras_3(): + _MULTI_BACKEND = True # Attempt to read KerasCV config file. _config_path = os.path.expanduser(os.path.join(_keras_dir, "keras_cv.json")) @@ -64,7 +62,7 @@ def detect_if_keras_3(): _config = json.load(f) except ValueError: _config = {} - _MULTI_BACKEND = _config.gest("multi_backend", _MULTI_BACKEND) + _MULTI_BACKEND = _config.get("multi_backend", _MULTI_BACKEND) # Save config file, if possible. if not os.path.exists(_keras_dir): From 6203623d5dd1843b5ca3c5594dcb6c360c52e101 Mon Sep 17 00:00:00 2001 From: divyashreepathihalli Date: Tue, 7 Nov 2023 04:04:40 +0000 Subject: [PATCH 06/54] updatconfig --- keras_cv/backend/__init__.py | 9 ++++----- keras_cv/backend/config.py | 4 +--- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/keras_cv/backend/__init__.py b/keras_cv/backend/__init__.py index ea677d4162..ea49fd9ccd 100644 --- a/keras_cv/backend/__init__.py +++ b/keras_cv/backend/__init__.py @@ -42,12 +42,11 @@ "models->saving": ["load_model"], } - -if multi_backend(): +if detect_if_tensorflow_uses_keras_3(): + from tensorflow import keras +elif multi_backend(): import keras - if detect_if_tensorflow_uses_keras_3(): - from tensorflow import keras - elif not hasattr(keras, "__version__") or parse(keras.__version__) < parse( + if not hasattr(keras, "__version__") or parse(keras.__version__) < parse( "3.0" ): import keras_core as keras diff --git a/keras_cv/backend/config.py b/keras_cv/backend/config.py index e305efab82..06cb5e344e 100644 --- a/keras_cv/backend/config.py +++ b/keras_cv/backend/config.py @@ -49,9 +49,7 @@ def detect_if_keras_3(): return False -if detect_if_tensorflow_uses_keras_3(): - _MULTI_BACKEND = True -elif detect_if_keras_3(): +if detect_if_tensorflow_uses_keras_3() or detect_if_keras_3(): _MULTI_BACKEND = True # Attempt to read KerasCV config file. From 806a74f28b0e9364efaa60479d109c8f15a75c2a Mon Sep 17 00:00:00 2001 From: divyashreepathihalli Date: Tue, 7 Nov 2023 05:05:30 +0000 Subject: [PATCH 07/54] update tf_ops --- keras_cv/backend/tf_ops.py | 53 ++++++++++++++++++++++++-------------- 1 file changed, 33 insertions(+), 20 deletions(-) diff --git a/keras_cv/backend/tf_ops.py b/keras_cv/backend/tf_ops.py index 106c9d0a33..3ac39f56fa 100644 --- a/keras_cv/backend/tf_ops.py +++ b/keras_cv/backend/tf_ops.py @@ -11,24 +11,37 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -from keras_core.src.backend.tensorflow import * # noqa: F403, F401 -from keras_core.src.backend.tensorflow import ( # noqa: F403, F401 - convert_to_numpy, -) -from keras_core.src.backend.tensorflow.core import * # noqa: F403, F401 -from keras_core.src.backend.tensorflow.math import * # noqa: F403, F401 -from keras_core.src.backend.tensorflow.nn import * # noqa: F403, F401 -from keras_core.src.backend.tensorflow.numpy import * # noqa: F403, F401 +from keras_cv.backend import config -# Some TF APIs where the numpy API doesn't support raggeds that we need -from tensorflow import broadcast_to # noqa: F403, F401 -from tensorflow import concat as concatenate # noqa: F403, F401 -from tensorflow import range as arange # noqa: F403, F401 -from tensorflow import reduce_all as all # noqa: F403, F401 -from tensorflow import reduce_max as max # noqa: F403, F401 -from tensorflow import repeat # noqa: F403, F401 -from tensorflow import reshape # noqa: F403, F401 -from tensorflow import split # noqa: F403, F401 -from tensorflow.keras.preprocessing.image import ( # noqa: F403, F401 - smart_resize, -) +if config.detect_if_keras_3(): + from keras.src.backend.tensorflow import * # noqa: F403, F401 + from keras.src.backend.tensorflow.core import * # noqa: F403, F401 + from keras.src.backend.tensorflow.math import * # noqa: F403, F401 + from keras.src.backend.tensorflow.nn import * # noqa: F403, F401 + from keras.src.backend.tensorflow.numpy import * # noqa: F403, F401 + from keras_core.src.backend.tensorflow import ( # noqa: F403, F401 + convert_to_numpy, + ) +elif config.multi_backend(): + from keras_core.src.backend.tensorflow import * # noqa: F403, F401 + from keras_core.src.backend.tensorflow import ( # noqa: F403, F401 + convert_to_numpy, + ) + from keras_core.src.backend.tensorflow.core import * # noqa: F403, F401 + from keras_core.src.backend.tensorflow.math import * # noqa: F403, F401 + from keras_core.src.backend.tensorflow.nn import * # noqa: F403, F401 + from keras_core.src.backend.tensorflow.numpy import * # noqa: F403, F401 + +else: + # Some TF APIs where the numpy API doesn't support raggeds that we need + from tensorflow import broadcast_to # noqa: F403, F401 + from tensorflow import concat as concatenate # noqa: F403, F401 + from tensorflow import range as arange # noqa: F403, F401 + from tensorflow import reduce_all as all # noqa: F403, F401 + from tensorflow import reduce_max as max # noqa: F403, F401 + from tensorflow import repeat # noqa: F403, F401 + from tensorflow import reshape # noqa: F403, F401 + from tensorflow import split # noqa: F403, F401 + from tensorflow.keras.preprocessing.image import ( # noqa: F403, F401 + smart_resize, + ) From 47dee448316f49406d6957eae4f73fe917bc5e82 Mon Sep 17 00:00:00 2001 From: divyashreepathihalli Date: Tue, 7 Nov 2023 05:10:49 +0000 Subject: [PATCH 08/54] update tf -ops --- keras_cv/backend/tf_ops.py | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/keras_cv/backend/tf_ops.py b/keras_cv/backend/tf_ops.py index 3ac39f56fa..e19ec40016 100644 --- a/keras_cv/backend/tf_ops.py +++ b/keras_cv/backend/tf_ops.py @@ -15,13 +15,13 @@ if config.detect_if_keras_3(): from keras.src.backend.tensorflow import * # noqa: F403, F401 + from keras.src.backend.tensorflow import ( # noqa: F403, F401 + convert_to_numpy, + ) from keras.src.backend.tensorflow.core import * # noqa: F403, F401 from keras.src.backend.tensorflow.math import * # noqa: F403, F401 from keras.src.backend.tensorflow.nn import * # noqa: F403, F401 from keras.src.backend.tensorflow.numpy import * # noqa: F403, F401 - from keras_core.src.backend.tensorflow import ( # noqa: F403, F401 - convert_to_numpy, - ) elif config.multi_backend(): from keras_core.src.backend.tensorflow import * # noqa: F403, F401 from keras_core.src.backend.tensorflow import ( # noqa: F403, F401 @@ -32,16 +32,16 @@ from keras_core.src.backend.tensorflow.nn import * # noqa: F403, F401 from keras_core.src.backend.tensorflow.numpy import * # noqa: F403, F401 -else: - # Some TF APIs where the numpy API doesn't support raggeds that we need - from tensorflow import broadcast_to # noqa: F403, F401 - from tensorflow import concat as concatenate # noqa: F403, F401 - from tensorflow import range as arange # noqa: F403, F401 - from tensorflow import reduce_all as all # noqa: F403, F401 - from tensorflow import reduce_max as max # noqa: F403, F401 - from tensorflow import repeat # noqa: F403, F401 - from tensorflow import reshape # noqa: F403, F401 - from tensorflow import split # noqa: F403, F401 - from tensorflow.keras.preprocessing.image import ( # noqa: F403, F401 - smart_resize, - ) + +# Some TF APIs where the numpy API doesn't support raggeds that we need +from tensorflow import broadcast_to # noqa: F403, F401 +from tensorflow import concat as concatenate # noqa: F403, F401 +from tensorflow import range as arange # noqa: F403, F401 +from tensorflow import reduce_all as all # noqa: F403, F401 +from tensorflow import reduce_max as max # noqa: F403, F401 +from tensorflow import repeat # noqa: F403, F401 +from tensorflow import reshape # noqa: F403, F401 +from tensorflow import split # noqa: F403, F401 +from tensorflow.keras.preprocessing.image import ( # noqa: F403, F401 + smart_resize, +) From b07ffd7f03b8574cb09d44547f8d8b27036bb3ed Mon Sep 17 00:00:00 2001 From: divyashreepathihalli Date: Tue, 7 Nov 2023 05:16:14 +0000 Subject: [PATCH 09/54] update tf ops --- keras_cv/backend/tf_ops.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/keras_cv/backend/tf_ops.py b/keras_cv/backend/tf_ops.py index e19ec40016..8aa36de6e8 100644 --- a/keras_cv/backend/tf_ops.py +++ b/keras_cv/backend/tf_ops.py @@ -32,7 +32,8 @@ from keras_core.src.backend.tensorflow.nn import * # noqa: F403, F401 from keras_core.src.backend.tensorflow.numpy import * # noqa: F403, F401 - +else: + from tensorflow.keras import * # Some TF APIs where the numpy API doesn't support raggeds that we need from tensorflow import broadcast_to # noqa: F403, F401 from tensorflow import concat as concatenate # noqa: F403, F401 From 0461f57ee85d25e421fee328247c0500b2aaa086 Mon Sep 17 00:00:00 2001 From: divyashreepathihalli Date: Tue, 7 Nov 2023 05:20:41 +0000 Subject: [PATCH 10/54] undo last commit --- keras_cv/backend/tf_ops.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/keras_cv/backend/tf_ops.py b/keras_cv/backend/tf_ops.py index 8aa36de6e8..6ff4578d24 100644 --- a/keras_cv/backend/tf_ops.py +++ b/keras_cv/backend/tf_ops.py @@ -32,8 +32,6 @@ from keras_core.src.backend.tensorflow.nn import * # noqa: F403, F401 from keras_core.src.backend.tensorflow.numpy import * # noqa: F403, F401 -else: - from tensorflow.keras import * # Some TF APIs where the numpy API doesn't support raggeds that we need from tensorflow import broadcast_to # noqa: F403, F401 from tensorflow import concat as concatenate # noqa: F403, F401 From 7ead82881d23b0ff1ea596301819f6838596b9f9 Mon Sep 17 00:00:00 2001 From: divyashreepathihalli Date: Tue, 7 Nov 2023 05:44:51 +0000 Subject: [PATCH 11/54] update tf_ops.py --- keras_cv/backend/tf_ops.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keras_cv/backend/tf_ops.py b/keras_cv/backend/tf_ops.py index 6ff4578d24..3adfd88fe7 100644 --- a/keras_cv/backend/tf_ops.py +++ b/keras_cv/backend/tf_ops.py @@ -13,7 +13,7 @@ # limitations under the License. from keras_cv.backend import config -if config.detect_if_keras_3(): +if config.detect_if_keras_3() or config.detect_if_tensorflow_uses_keras_3(): from keras.src.backend.tensorflow import * # noqa: F403, F401 from keras.src.backend.tensorflow import ( # noqa: F403, F401 convert_to_numpy, From 4883a178648c6f578d0390aaa5ef3cb69fec1ff4 Mon Sep 17 00:00:00 2001 From: divyashreepathihalli Date: Tue, 7 Nov 2023 06:28:23 +0000 Subject: [PATCH 12/54] reformat --- keras_cv/backend/__init__.py | 1 + keras_cv/backend/config.py | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/keras_cv/backend/__init__.py b/keras_cv/backend/__init__.py index ea49fd9ccd..0e40b8e643 100644 --- a/keras_cv/backend/__init__.py +++ b/keras_cv/backend/__init__.py @@ -46,6 +46,7 @@ from tensorflow import keras elif multi_backend(): import keras + if not hasattr(keras, "__version__") or parse(keras.__version__) < parse( "3.0" ): diff --git a/keras_cv/backend/config.py b/keras_cv/backend/config.py index 06cb5e344e..cf830fbe1e 100644 --- a/keras_cv/backend/config.py +++ b/keras_cv/backend/config.py @@ -14,8 +14,6 @@ import json import os -from packaging.version import parse - _MULTI_BACKEND = False # Set Keras base dir path given KERAS_HOME env variable, if applicable. @@ -43,6 +41,7 @@ def detect_if_tensorflow_uses_keras_3(): def detect_if_keras_3(): import keras + if hasattr(keras, "__version__") and keras.__version__.startswith("3."): return True else: From fca1b0cc485fc68a13acfe63d8ca30e9cdfb9dad Mon Sep 17 00:00:00 2001 From: divyashreepathihalli Date: Tue, 7 Nov 2023 21:25:49 +0000 Subject: [PATCH 13/54] update init() --- keras_cv/backend/__init__.py | 11 +++++------ keras_cv/backend/tf_ops.py | 19 ++++++++++--------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/keras_cv/backend/__init__.py b/keras_cv/backend/__init__.py index 0e40b8e643..4c0be6f828 100644 --- a/keras_cv/backend/__init__.py +++ b/keras_cv/backend/__init__.py @@ -24,11 +24,12 @@ import types +from keras_cv.backend.config import ( + detect_if_tensorflow_uses_keras_3, + multi_backend, +) from packaging.version import parse -from keras_cv.backend.config import detect_if_tensorflow_uses_keras_3 -from keras_cv.backend.config import multi_backend - # Keys are of the form: "module.where.attr.exists->module.where.to.alias" # Value are of the form: ["attr1", "attr2", ...] or # [("attr1_original_name", "attr1_alias_name")] @@ -42,9 +43,7 @@ "models->saving": ["load_model"], } -if detect_if_tensorflow_uses_keras_3(): - from tensorflow import keras -elif multi_backend(): +if (not detect_if_tensorflow_uses_keras_3()) and multi_backend(): import keras if not hasattr(keras, "__version__") or parse(keras.__version__) < parse( diff --git a/keras_cv/backend/tf_ops.py b/keras_cv/backend/tf_ops.py index 3adfd88fe7..893cc0acd7 100644 --- a/keras_cv/backend/tf_ops.py +++ b/keras_cv/backend/tf_ops.py @@ -15,18 +15,18 @@ if config.detect_if_keras_3() or config.detect_if_tensorflow_uses_keras_3(): from keras.src.backend.tensorflow import * # noqa: F403, F401 - from keras.src.backend.tensorflow import ( # noqa: F403, F401 + from keras.src.backend.tensorflow import ( convert_to_numpy, - ) + ) # noqa: F403, F401 from keras.src.backend.tensorflow.core import * # noqa: F403, F401 from keras.src.backend.tensorflow.math import * # noqa: F403, F401 from keras.src.backend.tensorflow.nn import * # noqa: F403, F401 from keras.src.backend.tensorflow.numpy import * # noqa: F403, F401 elif config.multi_backend(): from keras_core.src.backend.tensorflow import * # noqa: F403, F401 - from keras_core.src.backend.tensorflow import ( # noqa: F403, F401 + from keras_core.src.backend.tensorflow import ( convert_to_numpy, - ) + ) # noqa: F403, F401 from keras_core.src.backend.tensorflow.core import * # noqa: F403, F401 from keras_core.src.backend.tensorflow.math import * # noqa: F403, F401 from keras_core.src.backend.tensorflow.nn import * # noqa: F403, F401 @@ -34,13 +34,14 @@ # Some TF APIs where the numpy API doesn't support raggeds that we need from tensorflow import broadcast_to # noqa: F403, F401 +from tensorflow import repeat # noqa: F403, F401 +from tensorflow import reshape # noqa: F403, F401 +from tensorflow import split # noqa: F403, F401 from tensorflow import concat as concatenate # noqa: F403, F401 +from tensorflow import keras as tensorflow_keras from tensorflow import range as arange # noqa: F403, F401 from tensorflow import reduce_all as all # noqa: F403, F401 from tensorflow import reduce_max as max # noqa: F403, F401 -from tensorflow import repeat # noqa: F403, F401 -from tensorflow import reshape # noqa: F403, F401 -from tensorflow import split # noqa: F403, F401 -from tensorflow.keras.preprocessing.image import ( # noqa: F403, F401 +from tensorflow_keras.preprocessing.image import ( smart_resize, -) +) # noqa: F403, F401 From 80930d9fb335ee6b571121fdeea10c750ac78d9a Mon Sep 17 00:00:00 2001 From: divyashreepathihalli Date: Tue, 7 Nov 2023 21:30:15 +0000 Subject: [PATCH 14/54] update minor error in tf ops --- keras_cv/backend/tf_ops.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keras_cv/backend/tf_ops.py b/keras_cv/backend/tf_ops.py index 893cc0acd7..42af1ca5ff 100644 --- a/keras_cv/backend/tf_ops.py +++ b/keras_cv/backend/tf_ops.py @@ -42,6 +42,6 @@ from tensorflow import range as arange # noqa: F403, F401 from tensorflow import reduce_all as all # noqa: F403, F401 from tensorflow import reduce_max as max # noqa: F403, F401 -from tensorflow_keras.preprocessing.image import ( +from tensorflow.keras.preprocessing.image import ( smart_resize, ) # noqa: F403, F401 From 99ad00c808bac99fb7a2f26da21740e5443d3a19 Mon Sep 17 00:00:00 2001 From: divyashreepathihalli Date: Tue, 7 Nov 2023 22:01:14 +0000 Subject: [PATCH 15/54] remove check for keras 3 --- keras_cv/backend/config.py | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/keras_cv/backend/config.py b/keras_cv/backend/config.py index cf830fbe1e..c99a566831 100644 --- a/keras_cv/backend/config.py +++ b/keras_cv/backend/config.py @@ -39,16 +39,7 @@ def detect_if_tensorflow_uses_keras_3(): return False -def detect_if_keras_3(): - import keras - - if hasattr(keras, "__version__") and keras.__version__.startswith("3."): - return True - else: - return False - - -if detect_if_tensorflow_uses_keras_3() or detect_if_keras_3(): +if detect_if_tensorflow_uses_keras_3(): _MULTI_BACKEND = True # Attempt to read KerasCV config file. From 3ec653dbe0483fec9c24033bbd3ee4a32ebbbb93 Mon Sep 17 00:00:00 2001 From: divyashreepathihalli Date: Tue, 7 Nov 2023 22:11:57 +0000 Subject: [PATCH 16/54] revert changes to tf_ops --- keras_cv/backend/tf_ops.py | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/keras_cv/backend/tf_ops.py b/keras_cv/backend/tf_ops.py index 42af1ca5ff..78aa8acedb 100644 --- a/keras_cv/backend/tf_ops.py +++ b/keras_cv/backend/tf_ops.py @@ -13,16 +13,7 @@ # limitations under the License. from keras_cv.backend import config -if config.detect_if_keras_3() or config.detect_if_tensorflow_uses_keras_3(): - from keras.src.backend.tensorflow import * # noqa: F403, F401 - from keras.src.backend.tensorflow import ( - convert_to_numpy, - ) # noqa: F403, F401 - from keras.src.backend.tensorflow.core import * # noqa: F403, F401 - from keras.src.backend.tensorflow.math import * # noqa: F403, F401 - from keras.src.backend.tensorflow.nn import * # noqa: F403, F401 - from keras.src.backend.tensorflow.numpy import * # noqa: F403, F401 -elif config.multi_backend(): +if config.multi_backend(): from keras_core.src.backend.tensorflow import * # noqa: F403, F401 from keras_core.src.backend.tensorflow import ( convert_to_numpy, From e9da187d3d23648a174c4a50751edaeb6d60fe81 Mon Sep 17 00:00:00 2001 From: divyashreepathihalli Date: Wed, 8 Nov 2023 00:21:52 +0000 Subject: [PATCH 17/54] disable layers using internal base random layer --- keras_cv/layers/check_keras_version_layer.py | 18 ++++++++++++++++++ .../base_augmentation_layer_3d.py | 13 +++++++++++-- keras_cv/layers/regularization/dropblock_2d.py | 13 +++++++++++-- 3 files changed, 40 insertions(+), 4 deletions(-) create mode 100644 keras_cv/layers/check_keras_version_layer.py diff --git a/keras_cv/layers/check_keras_version_layer.py b/keras_cv/layers/check_keras_version_layer.py new file mode 100644 index 0000000000..af0739ad43 --- /dev/null +++ b/keras_cv/layers/check_keras_version_layer.py @@ -0,0 +1,18 @@ +# Copyright 2023 The KerasCV Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +class CheckKerasVersionLayer(keras.layers.Layer): + """check keras version and raise an error if the layer is not supported""" + + def __init__(self, layers): + raise ValueError "This layer is not supported in keras 3" diff --git a/keras_cv/layers/preprocessing_3d/base_augmentation_layer_3d.py b/keras_cv/layers/preprocessing_3d/base_augmentation_layer_3d.py index 49fa2772d1..2ffd17cc9b 100644 --- a/keras_cv/layers/preprocessing_3d/base_augmentation_layer_3d.py +++ b/keras_cv/layers/preprocessing_3d/base_augmentation_layer_3d.py @@ -13,9 +13,18 @@ # limitations under the License. import tensorflow as tf +from keras_cv.api_export import keras_cv_export +from keras_cv.backend.config import detect_if_tensorflow_uses_keras_3 from tensorflow import keras -from keras_cv.api_export import keras_cv_export +if detect_if_tensorflow_uses_keras_3(): + from keras_cv.layers import check_keras_version_layer + + base_layer = check_keras_version_layer +else: + from tensorflow.keras.__internal__.layers import BaseRandomLayer + + base_layer = BaseRandomLayer POINT_CLOUDS = "point_clouds" BOUNDING_BOXES = "bounding_boxes" @@ -29,7 +38,7 @@ @keras_cv_export("keras_cv.layers.BaseAugmentationLayer3D") -class BaseAugmentationLayer3D(keras.__internal__.layers.BaseRandomLayer): +class BaseAugmentationLayer3D(base_layer): """Abstract base layer for data augmentation for 3D perception. This layer contains base functionalities for preprocessing layers which diff --git a/keras_cv/layers/regularization/dropblock_2d.py b/keras_cv/layers/regularization/dropblock_2d.py index 72c5835fd4..fc09d19868 100644 --- a/keras_cv/layers/regularization/dropblock_2d.py +++ b/keras_cv/layers/regularization/dropblock_2d.py @@ -13,14 +13,23 @@ # limitations under the License. import tensorflow as tf -from tensorflow.keras.__internal__.layers import BaseRandomLayer +from keras_cv.backend.config import detect_if_tensorflow_uses_keras_3 + +if detect_if_tensorflow_uses_keras_3(): + from keras_cv.layers import check_keras_version_layer + + base_layer = check_keras_version_layer +else: + from tensorflow.keras.__internal__.layers import BaseRandomLayer + + base_layer = BaseRandomLayer from keras_cv.api_export import keras_cv_export from keras_cv.utils import conv_utils @keras_cv_export("keras_cv.layers.DropBlock2D") -class DropBlock2D(BaseRandomLayer): +class DropBlock2D(base_layer): """Applies DropBlock regularization to input features. DropBlock is a form of structured dropout, where units in a contiguous From 8900fc617a8efc9f6d410029c74311adcac98244 Mon Sep 17 00:00:00 2001 From: divyashreepathihalli Date: Wed, 8 Nov 2023 00:27:07 +0000 Subject: [PATCH 18/54] update syntax error --- keras_cv/layers/check_keras_version_layer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keras_cv/layers/check_keras_version_layer.py b/keras_cv/layers/check_keras_version_layer.py index af0739ad43..532154dde7 100644 --- a/keras_cv/layers/check_keras_version_layer.py +++ b/keras_cv/layers/check_keras_version_layer.py @@ -15,4 +15,4 @@ class CheckKerasVersionLayer(keras.layers.Layer): """check keras version and raise an error if the layer is not supported""" def __init__(self, layers): - raise ValueError "This layer is not supported in keras 3" + raise ValueError("This layer is not supported in keras 3") From 064882e75c5bc71310493e03af22caa2bdb50536 Mon Sep 17 00:00:00 2001 From: divyashreepathihalli Date: Wed, 8 Nov 2023 00:31:14 +0000 Subject: [PATCH 19/54] update imports in keras version check layer --- keras_cv/layers/check_keras_version_layer.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/keras_cv/layers/check_keras_version_layer.py b/keras_cv/layers/check_keras_version_layer.py index 532154dde7..38b0ced53d 100644 --- a/keras_cv/layers/check_keras_version_layer.py +++ b/keras_cv/layers/check_keras_version_layer.py @@ -11,6 +11,10 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. + +from tensorflow import keras + + class CheckKerasVersionLayer(keras.layers.Layer): """check keras version and raise an error if the layer is not supported""" From 25d07b99cad8c3a6d8c340d37611d7bd9076074e Mon Sep 17 00:00:00 2001 From: divyashreepathihalli Date: Wed, 8 Nov 2023 00:39:20 +0000 Subject: [PATCH 20/54] update init method in keras version check --- keras_cv/layers/check_keras_version_layer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keras_cv/layers/check_keras_version_layer.py b/keras_cv/layers/check_keras_version_layer.py index 38b0ced53d..b3210bd53e 100644 --- a/keras_cv/layers/check_keras_version_layer.py +++ b/keras_cv/layers/check_keras_version_layer.py @@ -18,5 +18,5 @@ class CheckKerasVersionLayer(keras.layers.Layer): """check keras version and raise an error if the layer is not supported""" - def __init__(self, layers): + def __init__(self, **kwargs): raise ValueError("This layer is not supported in keras 3") From 4605bc248639e1d75875908f3562f9e6943698c0 Mon Sep 17 00:00:00 2001 From: divyashreepathihalli Date: Wed, 8 Nov 2023 00:43:22 +0000 Subject: [PATCH 21/54] add seed argument --- keras_cv/layers/check_keras_version_layer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keras_cv/layers/check_keras_version_layer.py b/keras_cv/layers/check_keras_version_layer.py index b3210bd53e..7afc204f88 100644 --- a/keras_cv/layers/check_keras_version_layer.py +++ b/keras_cv/layers/check_keras_version_layer.py @@ -18,5 +18,5 @@ class CheckKerasVersionLayer(keras.layers.Layer): """check keras version and raise an error if the layer is not supported""" - def __init__(self, **kwargs): + def __init__(self, seed, **kwargs): raise ValueError("This layer is not supported in keras 3") From 3d78415fa1d0e800748bdb1bd777303b6f25bbbf Mon Sep 17 00:00:00 2001 From: divyashreepathihalli Date: Wed, 8 Nov 2023 00:51:45 +0000 Subject: [PATCH 22/54] rasie error in class itself --- keras_cv/layers/preprocessing_3d/base_augmentation_layer_3d.py | 2 ++ keras_cv/layers/regularization/dropblock_2d.py | 2 ++ 2 files changed, 4 insertions(+) diff --git a/keras_cv/layers/preprocessing_3d/base_augmentation_layer_3d.py b/keras_cv/layers/preprocessing_3d/base_augmentation_layer_3d.py index 2ffd17cc9b..d0c7804e6d 100644 --- a/keras_cv/layers/preprocessing_3d/base_augmentation_layer_3d.py +++ b/keras_cv/layers/preprocessing_3d/base_augmentation_layer_3d.py @@ -108,6 +108,8 @@ def augment_pointclouds(self, point_clouds, transformation): """ def __init__(self, seed=None, **kwargs): + if detect_if_tensorflow_uses_keras_3(): + raise ImportError("this layer is not supported in keras 3") super().__init__(seed=seed, **kwargs) self.auto_vectorize = False diff --git a/keras_cv/layers/regularization/dropblock_2d.py b/keras_cv/layers/regularization/dropblock_2d.py index fc09d19868..36d5ff9be6 100644 --- a/keras_cv/layers/regularization/dropblock_2d.py +++ b/keras_cv/layers/regularization/dropblock_2d.py @@ -154,6 +154,8 @@ def __init__( seed=None, **kwargs, ): + if detect_if_tensorflow_uses_keras_3(): + raise ImportError("this layer is not supported in keras 3") super().__init__(seed=seed, **kwargs) if not 0.0 <= rate <= 1.0: raise ValueError( From 042f87826a756bdb4503e2fc031979bf266d11f8 Mon Sep 17 00:00:00 2001 From: divyashreepathihalli Date: Wed, 8 Nov 2023 00:56:48 +0000 Subject: [PATCH 23/54] update constructor --- .../base_augmentation_layer_3d.py | 7 +++-- .../layers/regularization/dropblock_2d.py | 30 ++++++++++--------- 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/keras_cv/layers/preprocessing_3d/base_augmentation_layer_3d.py b/keras_cv/layers/preprocessing_3d/base_augmentation_layer_3d.py index d0c7804e6d..20fe6d5238 100644 --- a/keras_cv/layers/preprocessing_3d/base_augmentation_layer_3d.py +++ b/keras_cv/layers/preprocessing_3d/base_augmentation_layer_3d.py @@ -109,9 +109,10 @@ def augment_pointclouds(self, point_clouds, transformation): def __init__(self, seed=None, **kwargs): if detect_if_tensorflow_uses_keras_3(): - raise ImportError("this layer is not supported in keras 3") - super().__init__(seed=seed, **kwargs) - self.auto_vectorize = False + pass + else: + super().__init__(seed=seed, **kwargs) + self.auto_vectorize = False @property def auto_vectorize(self): diff --git a/keras_cv/layers/regularization/dropblock_2d.py b/keras_cv/layers/regularization/dropblock_2d.py index 36d5ff9be6..8b572e6139 100644 --- a/keras_cv/layers/regularization/dropblock_2d.py +++ b/keras_cv/layers/regularization/dropblock_2d.py @@ -155,21 +155,23 @@ def __init__( **kwargs, ): if detect_if_tensorflow_uses_keras_3(): - raise ImportError("this layer is not supported in keras 3") - super().__init__(seed=seed, **kwargs) - if not 0.0 <= rate <= 1.0: - raise ValueError( - f"rate must be a number between 0 and 1. " f"Received: {rate}" + pass + else: + super().__init__(seed=seed, **kwargs) + if not 0.0 <= rate <= 1.0: + raise ValueError( + f"rate must be a number between 0 and 1. " + f"Received: {rate}" + ) + + self._rate = rate + ( + self._dropblock_height, + self._dropblock_width, + ) = conv_utils.normalize_tuple( + value=block_size, n=2, name="block_size", allow_zero=False ) - - self._rate = rate - ( - self._dropblock_height, - self._dropblock_width, - ) = conv_utils.normalize_tuple( - value=block_size, n=2, name="block_size", allow_zero=False - ) - self.seed = seed + self.seed = seed def call(self, x, training=None): if not training or self._rate == 0.0: From db128d0317203c7a63be59693088e4f07cd981ad Mon Sep 17 00:00:00 2001 From: divyashreepathihalli Date: Wed, 8 Nov 2023 01:02:22 +0000 Subject: [PATCH 24/54] update to import directly from layers --- keras_cv/layers/check_keras_version_layer.py | 22 ------------------- .../base_augmentation_layer_3d.py | 4 +--- .../layers/regularization/dropblock_2d.py | 4 +--- 3 files changed, 2 insertions(+), 28 deletions(-) delete mode 100644 keras_cv/layers/check_keras_version_layer.py diff --git a/keras_cv/layers/check_keras_version_layer.py b/keras_cv/layers/check_keras_version_layer.py deleted file mode 100644 index 7afc204f88..0000000000 --- a/keras_cv/layers/check_keras_version_layer.py +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright 2023 The KerasCV Authors -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from tensorflow import keras - - -class CheckKerasVersionLayer(keras.layers.Layer): - """check keras version and raise an error if the layer is not supported""" - - def __init__(self, seed, **kwargs): - raise ValueError("This layer is not supported in keras 3") diff --git a/keras_cv/layers/preprocessing_3d/base_augmentation_layer_3d.py b/keras_cv/layers/preprocessing_3d/base_augmentation_layer_3d.py index 20fe6d5238..3e9fd5df83 100644 --- a/keras_cv/layers/preprocessing_3d/base_augmentation_layer_3d.py +++ b/keras_cv/layers/preprocessing_3d/base_augmentation_layer_3d.py @@ -18,9 +18,7 @@ from tensorflow import keras if detect_if_tensorflow_uses_keras_3(): - from keras_cv.layers import check_keras_version_layer - - base_layer = check_keras_version_layer + base_layer = tf.keras.layers.Layer else: from tensorflow.keras.__internal__.layers import BaseRandomLayer diff --git a/keras_cv/layers/regularization/dropblock_2d.py b/keras_cv/layers/regularization/dropblock_2d.py index 8b572e6139..96f657ba95 100644 --- a/keras_cv/layers/regularization/dropblock_2d.py +++ b/keras_cv/layers/regularization/dropblock_2d.py @@ -16,9 +16,7 @@ from keras_cv.backend.config import detect_if_tensorflow_uses_keras_3 if detect_if_tensorflow_uses_keras_3(): - from keras_cv.layers import check_keras_version_layer - - base_layer = check_keras_version_layer + base_layer = tf.keras.layers.Layer else: from tensorflow.keras.__internal__.layers import BaseRandomLayer From c85b9881fbadccab3b77bf126293d36dba1caa24 Mon Sep 17 00:00:00 2001 From: divyashreepathihalli Date: Wed, 8 Nov 2023 01:07:31 +0000 Subject: [PATCH 25/54] update import in base image augmenattion layer --- .../layers/preprocessing/base_image_augmentation_layer.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/keras_cv/layers/preprocessing/base_image_augmentation_layer.py b/keras_cv/layers/preprocessing/base_image_augmentation_layer.py index 8b6a255cd9..ad8036a379 100644 --- a/keras_cv/layers/preprocessing/base_image_augmentation_layer.py +++ b/keras_cv/layers/preprocessing/base_image_augmentation_layer.py @@ -22,8 +22,7 @@ from keras_cv import bounding_box from keras_cv.api_export import keras_cv_export -from keras_cv.backend import keras -from keras_cv.backend import scope +from keras_cv.backend import keras, scope from keras_cv.backend.config import multi_backend from keras_cv.utils import preprocessing @@ -43,7 +42,7 @@ base_class = ( - keras.src.layers.preprocessing.tf_data_layer.TFDataLayer + keras.layers.preprocessing.tf_data_layer.TFDataLayer if multi_backend() else keras.layers.Layer ) From e27c90785be9276398e2cc45c65e7a048337d5a3 Mon Sep 17 00:00:00 2001 From: divyashreepathihalli Date: Wed, 8 Nov 2023 02:30:47 +0000 Subject: [PATCH 26/54] change import sin tf_ops --- keras_cv/backend/tf_ops.py | 2 +- keras_cv/layers/preprocessing/base_image_augmentation_layer.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/keras_cv/backend/tf_ops.py b/keras_cv/backend/tf_ops.py index 78aa8acedb..10f4890b3c 100644 --- a/keras_cv/backend/tf_ops.py +++ b/keras_cv/backend/tf_ops.py @@ -33,6 +33,6 @@ from tensorflow import range as arange # noqa: F403, F401 from tensorflow import reduce_all as all # noqa: F403, F401 from tensorflow import reduce_max as max # noqa: F403, F401 -from tensorflow.keras.preprocessing.image import ( +from tensorflow_keras.preprocessing.image import ( smart_resize, ) # noqa: F403, F401 diff --git a/keras_cv/layers/preprocessing/base_image_augmentation_layer.py b/keras_cv/layers/preprocessing/base_image_augmentation_layer.py index ad8036a379..c6752fc36d 100644 --- a/keras_cv/layers/preprocessing/base_image_augmentation_layer.py +++ b/keras_cv/layers/preprocessing/base_image_augmentation_layer.py @@ -42,7 +42,7 @@ base_class = ( - keras.layers.preprocessing.tf_data_layer.TFDataLayer + keras.src.layers.preprocessing.tf_data_layer.TFDataLayer if multi_backend() else keras.layers.Layer ) From 8ac259558a789cb8ca4b90686386d12679724374 Mon Sep 17 00:00:00 2001 From: divyashreepathihalli Date: Wed, 8 Nov 2023 02:48:09 +0000 Subject: [PATCH 27/54] update tf ops import --- keras_cv/backend/tf_ops.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/keras_cv/backend/tf_ops.py b/keras_cv/backend/tf_ops.py index 10f4890b3c..5fb8f96b8e 100644 --- a/keras_cv/backend/tf_ops.py +++ b/keras_cv/backend/tf_ops.py @@ -24,15 +24,12 @@ from keras_core.src.backend.tensorflow.numpy import * # noqa: F403, F401 # Some TF APIs where the numpy API doesn't support raggeds that we need +from keras.src.preprocessing import image # noqa: F403, F401 from tensorflow import broadcast_to # noqa: F403, F401 from tensorflow import repeat # noqa: F403, F401 from tensorflow import reshape # noqa: F403, F401 from tensorflow import split # noqa: F403, F401 from tensorflow import concat as concatenate # noqa: F403, F401 -from tensorflow import keras as tensorflow_keras from tensorflow import range as arange # noqa: F403, F401 from tensorflow import reduce_all as all # noqa: F403, F401 from tensorflow import reduce_max as max # noqa: F403, F401 -from tensorflow_keras.preprocessing.image import ( - smart_resize, -) # noqa: F403, F401 From db3ce2a453538b003b2b631b0a0d3a3c6ff10b3a Mon Sep 17 00:00:00 2001 From: divyashreepathihalli Date: Wed, 8 Nov 2023 03:05:01 +0000 Subject: [PATCH 28/54] change init --- keras_cv/backend/__init__.py | 17 ++---------- keras_cv/backend/keras.py | 54 ++++++++++++++++++++++++++++++++++++ keras_cv/backend/tf_ops.py | 2 +- 3 files changed, 58 insertions(+), 15 deletions(-) create mode 100644 keras_cv/backend/keras.py diff --git a/keras_cv/backend/__init__.py b/keras_cv/backend/__init__.py index 4c0be6f828..ceef8eb82d 100644 --- a/keras_cv/backend/__init__.py +++ b/keras_cv/backend/__init__.py @@ -21,7 +21,7 @@ - `keras`: The full `keras` API (via `keras_core` or `tf.keras`). - `ops`: `keras_core.ops`, always tf-backed if using `tf.keras`. """ - +""" import types from keras_cv.backend.config import ( @@ -83,20 +83,9 @@ # TF Keras doesn't have this rename. keras.activations.silu = keras.activations.swish - +""" from keras_cv.backend import config # noqa: E402 +from keras_cv.backend import keras # noqa: E402 from keras_cv.backend import ops # noqa: E402 from keras_cv.backend import random # noqa: E402 from keras_cv.backend import tf_ops # noqa: E402 - - -def assert_tf_keras(src): - if multi_backend(): - raise NotImplementedError( - f"KerasCV component {src} does not yet support Keras Core, and can " - "only be used in `tf.keras`." - ) - - -def supports_ragged(): - return not multi_backend() diff --git a/keras_cv/backend/keras.py b/keras_cv/backend/keras.py new file mode 100644 index 0000000000..df6c0af505 --- /dev/null +++ b/keras_cv/backend/keras.py @@ -0,0 +1,54 @@ +# Copyright 2023 The KerasNLP Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import types + +import tensorflow as tf +from keras_cv.backend import config + +if config.detect_if_tensorflow_uses_keras_3(): + from keras import * # noqa: F403, F401 +elif config.multi_backend(): + from keras_core import * # noqa: F403, F401 +else: + from tensorflow import keras + from tensorflow.keras import * # noqa: F403, F401 + + # Shims to handle symbol renames for older `tf.keras` versions. + if not hasattr(tf.keras, "saving"): + saving = types.SimpleNamespace() + else: + from tensorflow.keras import saving + from tensorflow.keras import utils + + if not hasattr(saving, "deserialize_keras_object"): + saving.deserialize_keras_object = utils.deserialize_keras_object + if not hasattr(saving, "serialize_keras_object"): + saving.serialize_keras_object = utils.serialize_keras_object + if not hasattr(saving, "register_keras_serializable"): + saving.register_keras_serializable = utils.register_keras_serializable + # TF Keras doesn't have this rename. + keras.activations.silu = keras.activations.swish + + +def assert_tf_keras(src): + if multi_backend(): + raise NotImplementedError( + f"KerasCV component {src} does not yet support Keras Core, and can " + "only be used in `tf.keras`." + ) + + +def supports_ragged(): + return not multi_backend() diff --git a/keras_cv/backend/tf_ops.py b/keras_cv/backend/tf_ops.py index 5fb8f96b8e..87d06788e5 100644 --- a/keras_cv/backend/tf_ops.py +++ b/keras_cv/backend/tf_ops.py @@ -14,6 +14,7 @@ from keras_cv.backend import config if config.multi_backend(): + from keras.src.preprocessing import image # noqa: F403, F401 from keras_core.src.backend.tensorflow import * # noqa: F403, F401 from keras_core.src.backend.tensorflow import ( convert_to_numpy, @@ -24,7 +25,6 @@ from keras_core.src.backend.tensorflow.numpy import * # noqa: F403, F401 # Some TF APIs where the numpy API doesn't support raggeds that we need -from keras.src.preprocessing import image # noqa: F403, F401 from tensorflow import broadcast_to # noqa: F403, F401 from tensorflow import repeat # noqa: F403, F401 from tensorflow import reshape # noqa: F403, F401 From fcdedeb6a70da9ab4e96cdeb426311e2a6a47f65 Mon Sep 17 00:00:00 2001 From: divyashreepathihalli Date: Wed, 8 Nov 2023 03:09:13 +0000 Subject: [PATCH 29/54] update tf_ops --- keras_cv/backend/tf_ops.py | 1 - 1 file changed, 1 deletion(-) diff --git a/keras_cv/backend/tf_ops.py b/keras_cv/backend/tf_ops.py index 87d06788e5..fe6a6eae58 100644 --- a/keras_cv/backend/tf_ops.py +++ b/keras_cv/backend/tf_ops.py @@ -14,7 +14,6 @@ from keras_cv.backend import config if config.multi_backend(): - from keras.src.preprocessing import image # noqa: F403, F401 from keras_core.src.backend.tensorflow import * # noqa: F403, F401 from keras_core.src.backend.tensorflow import ( convert_to_numpy, From 7c8b2f9fbb64af170578c9475736d13a27cbb756 Mon Sep 17 00:00:00 2001 From: divyashreepathihalli Date: Wed, 8 Nov 2023 03:14:46 +0000 Subject: [PATCH 30/54] update backend functions --- keras_cv/backend/__init__.py | 12 ++++++++++++ keras_cv/backend/keras.py | 12 ------------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/keras_cv/backend/__init__.py b/keras_cv/backend/__init__.py index ceef8eb82d..ab16a98cf3 100644 --- a/keras_cv/backend/__init__.py +++ b/keras_cv/backend/__init__.py @@ -89,3 +89,15 @@ from keras_cv.backend import ops # noqa: E402 from keras_cv.backend import random # noqa: E402 from keras_cv.backend import tf_ops # noqa: E402 + + +def assert_tf_keras(src): + if multi_backend(): + raise NotImplementedError( + f"KerasCV component {src} does not yet support Keras Core, and can " + "only be used in `tf.keras`." + ) + + +def supports_ragged(): + return not multi_backend() diff --git a/keras_cv/backend/keras.py b/keras_cv/backend/keras.py index df6c0af505..8261cdafad 100644 --- a/keras_cv/backend/keras.py +++ b/keras_cv/backend/keras.py @@ -40,15 +40,3 @@ saving.register_keras_serializable = utils.register_keras_serializable # TF Keras doesn't have this rename. keras.activations.silu = keras.activations.swish - - -def assert_tf_keras(src): - if multi_backend(): - raise NotImplementedError( - f"KerasCV component {src} does not yet support Keras Core, and can " - "only be used in `tf.keras`." - ) - - -def supports_ragged(): - return not multi_backend() From 5c9c51755dd90a9659e2bb1e292e3b6dbaadcebf Mon Sep 17 00:00:00 2001 From: divyashreepathihalli Date: Wed, 8 Nov 2023 07:07:49 +0000 Subject: [PATCH 31/54] keras.src --- keras_cv/backend/__init__.py | 4 ++-- .../models/object_detection/predict_utils.py | 18 +++++++++--------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/keras_cv/backend/__init__.py b/keras_cv/backend/__init__.py index ab16a98cf3..ee5c5dad53 100644 --- a/keras_cv/backend/__init__.py +++ b/keras_cv/backend/__init__.py @@ -92,7 +92,7 @@ def assert_tf_keras(src): - if multi_backend(): + if config.multi_backend(): raise NotImplementedError( f"KerasCV component {src} does not yet support Keras Core, and can " "only be used in `tf.keras`." @@ -100,4 +100,4 @@ def assert_tf_keras(src): def supports_ragged(): - return not multi_backend() + return not config.multi_backend() diff --git a/keras_cv/models/object_detection/predict_utils.py b/keras_cv/models/object_detection/predict_utils.py index 8eb6e10e62..c13c14d23d 100644 --- a/keras_cv/models/object_detection/predict_utils.py +++ b/keras_cv/models/object_detection/predict_utils.py @@ -15,12 +15,12 @@ import tensorflow as tf try: - from keras.src.engine.training import _minimum_control_deps - from keras.src.engine.training import reduce_per_replica + # from keras.src.engine.training import _minimum_control_deps + # from keras.src.engine.training import reduce_per_replica from keras.src.utils import tf_utils except ImportError: - from keras.engine.training import _minimum_control_deps - from keras.engine.training import reduce_per_replica + # from keras.engine.training import _minimum_control_deps + # from keras.engine.training import reduce_per_replica from keras.utils import tf_utils @@ -34,8 +34,8 @@ def step_function(iterator): def run_step(data): outputs = model.predict_step(data) # Ensure counter is updated only if `test_step` succeeds. - with tf.control_dependencies(_minimum_control_deps(outputs)): - model._predict_counter.assign_add(1) + # with tf.control_dependencies(_minimum_control_deps(outputs)): + model._predict_counter.assign_add(1) return outputs if model._jit_compile: @@ -45,9 +45,9 @@ def run_step(data): data = next(iterator) outputs = model.distribute_strategy.run(run_step, args=(data,)) - outputs = reduce_per_replica( - outputs, model.distribute_strategy, reduction="concat" - ) + # outputs = reduce_per_replica( + # outputs, model.distribute_strategy, reduction="concat" + # ) # Note that this is the only deviation from the base keras.Model # implementation. We add the decode_step inside of the computation # graph but outside of the distribute_strategy (i.e on host CPU). From 1de8a29459e5aecf3fad04362ea420911563ae62 Mon Sep 17 00:00:00 2001 From: divyashreepathihalli Date: Wed, 8 Nov 2023 07:30:53 +0000 Subject: [PATCH 32/54] update namespace --- keras_cv/backend/__init__.py | 73 ------------------- keras_cv/backend/keras.py | 8 +- .../models/object_detection/predict_utils.py | 1 + 3 files changed, 8 insertions(+), 74 deletions(-) diff --git a/keras_cv/backend/__init__.py b/keras_cv/backend/__init__.py index ee5c5dad53..890073a1eb 100644 --- a/keras_cv/backend/__init__.py +++ b/keras_cv/backend/__init__.py @@ -11,79 +11,6 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -""" -Keras backend module. - -This module adds a temporarily Keras API surface that is fully under KerasCV -control. This allows us to switch between `keras_core` and `tf.keras`, as well -as add shims to support older version of `tf.keras`. -- `config`: check which backend is being run. -- `keras`: The full `keras` API (via `keras_core` or `tf.keras`). -- `ops`: `keras_core.ops`, always tf-backed if using `tf.keras`. -""" -""" -import types - -from keras_cv.backend.config import ( - detect_if_tensorflow_uses_keras_3, - multi_backend, -) -from packaging.version import parse - -# Keys are of the form: "module.where.attr.exists->module.where.to.alias" -# Value are of the form: ["attr1", "attr2", ...] or -# [("attr1_original_name", "attr1_alias_name")] -_KERAS_CORE_ALIASES = { - "utils->saving": [ - "register_keras_serializable", - "deserialize_keras_object", - "serialize_keras_object", - "get_registered_object", - ], - "models->saving": ["load_model"], -} - -if (not detect_if_tensorflow_uses_keras_3()) and multi_backend(): - import keras - - if not hasattr(keras, "__version__") or parse(keras.__version__) < parse( - "3.0" - ): - import keras_core as keras - - keras.backend.name_scope = keras.name_scope -else: - from tensorflow import keras - - if not hasattr(keras, "saving"): - keras.saving = types.SimpleNamespace() - - # add aliases - for key, value in _KERAS_CORE_ALIASES.items(): - src, _, dst = key.partition("->") - src = src.split(".") - dst = dst.split(".") - - src_mod, dst_mod = keras, keras - - # navigate to where we want to alias the attributes - for mod in src: - src_mod = getattr(src_mod, mod) - for mod in dst: - dst_mod = getattr(dst_mod, mod) - - # add an alias for each attribute - for attr in value: - if isinstance(attr, tuple): - src_attr, dst_attr = attr - else: - src_attr, dst_attr = attr, attr - attr_val = getattr(src_mod, src_attr) - setattr(dst_mod, dst_attr, attr_val) - - # TF Keras doesn't have this rename. - keras.activations.silu = keras.activations.swish -""" from keras_cv.backend import config # noqa: E402 from keras_cv.backend import keras # noqa: E402 from keras_cv.backend import ops # noqa: E402 diff --git a/keras_cv/backend/keras.py b/keras_cv/backend/keras.py index 8261cdafad..6ddc8c86f7 100644 --- a/keras_cv/backend/keras.py +++ b/keras_cv/backend/keras.py @@ -1,4 +1,4 @@ -# Copyright 2023 The KerasNLP Authors +# Copyright 2023 The KerasCV Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -18,9 +18,15 @@ from keras_cv.backend import config if config.detect_if_tensorflow_uses_keras_3(): + import keras from keras import * # noqa: F403, F401 + + keras.backend.name_scope = keras.name_scope elif config.multi_backend(): from keras_core import * # noqa: F403, F401 + from keras_core import keras + + keras.backend.name_scope = keras.name_scope else: from tensorflow import keras from tensorflow.keras import * # noqa: F403, F401 diff --git a/keras_cv/models/object_detection/predict_utils.py b/keras_cv/models/object_detection/predict_utils.py index c13c14d23d..b354abf8f5 100644 --- a/keras_cv/models/object_detection/predict_utils.py +++ b/keras_cv/models/object_detection/predict_utils.py @@ -15,6 +15,7 @@ import tensorflow as tf try: + # To-do: these imports need to fixed - Issue 2134 # from keras.src.engine.training import _minimum_control_deps # from keras.src.engine.training import reduce_per_replica from keras.src.utils import tf_utils From 8d566dc1b56f8f3c9203a03a090269b16de9d62d Mon Sep 17 00:00:00 2001 From: divyashreepathihalli Date: Wed, 8 Nov 2023 07:35:31 +0000 Subject: [PATCH 33/54] update namescope correctly --- keras_cv/backend/keras.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/keras_cv/backend/keras.py b/keras_cv/backend/keras.py index 6ddc8c86f7..e938ee8aa6 100644 --- a/keras_cv/backend/keras.py +++ b/keras_cv/backend/keras.py @@ -18,17 +18,17 @@ from keras_cv.backend import config if config.detect_if_tensorflow_uses_keras_3(): - import keras + import keras # noqa: F403, F401 from keras import * # noqa: F403, F401 keras.backend.name_scope = keras.name_scope elif config.multi_backend(): + import keras_core as keras # noqa: F403, F401 from keras_core import * # noqa: F403, F401 - from keras_core import keras keras.backend.name_scope = keras.name_scope else: - from tensorflow import keras + from tensorflow import keras # noqa: F403, F401 from tensorflow.keras import * # noqa: F403, F401 # Shims to handle symbol renames for older `tf.keras` versions. From fdb0dc553bc60e4e6d02a7b0dadf200fd7cda977 Mon Sep 17 00:00:00 2001 From: divyashreepathihalli Date: Wed, 8 Nov 2023 07:42:45 +0000 Subject: [PATCH 34/54] code reformat --- keras_cv/backend/keras.py | 1 + keras_cv/backend/tf_ops.py | 10 +++++----- .../preprocessing/base_image_augmentation_layer.py | 3 ++- .../preprocessing_3d/base_augmentation_layer_3d.py | 6 ++---- keras_cv/layers/regularization/dropblock_2d.py | 1 + 5 files changed, 11 insertions(+), 10 deletions(-) diff --git a/keras_cv/backend/keras.py b/keras_cv/backend/keras.py index e938ee8aa6..d03a8a55ce 100644 --- a/keras_cv/backend/keras.py +++ b/keras_cv/backend/keras.py @@ -15,6 +15,7 @@ import types import tensorflow as tf + from keras_cv.backend import config if config.detect_if_tensorflow_uses_keras_3(): diff --git a/keras_cv/backend/tf_ops.py b/keras_cv/backend/tf_ops.py index fe6a6eae58..2648f1b2d7 100644 --- a/keras_cv/backend/tf_ops.py +++ b/keras_cv/backend/tf_ops.py @@ -15,9 +15,9 @@ if config.multi_backend(): from keras_core.src.backend.tensorflow import * # noqa: F403, F401 - from keras_core.src.backend.tensorflow import ( + from keras_core.src.backend.tensorflow import ( # noqa: F403, F401 convert_to_numpy, - ) # noqa: F403, F401 + ) from keras_core.src.backend.tensorflow.core import * # noqa: F403, F401 from keras_core.src.backend.tensorflow.math import * # noqa: F403, F401 from keras_core.src.backend.tensorflow.nn import * # noqa: F403, F401 @@ -25,10 +25,10 @@ # Some TF APIs where the numpy API doesn't support raggeds that we need from tensorflow import broadcast_to # noqa: F403, F401 -from tensorflow import repeat # noqa: F403, F401 -from tensorflow import reshape # noqa: F403, F401 -from tensorflow import split # noqa: F403, F401 from tensorflow import concat as concatenate # noqa: F403, F401 from tensorflow import range as arange # noqa: F403, F401 from tensorflow import reduce_all as all # noqa: F403, F401 from tensorflow import reduce_max as max # noqa: F403, F401 +from tensorflow import repeat # noqa: F403, F401 +from tensorflow import reshape # noqa: F403, F401 +from tensorflow import split # noqa: F403, F401 diff --git a/keras_cv/layers/preprocessing/base_image_augmentation_layer.py b/keras_cv/layers/preprocessing/base_image_augmentation_layer.py index c6752fc36d..8b6a255cd9 100644 --- a/keras_cv/layers/preprocessing/base_image_augmentation_layer.py +++ b/keras_cv/layers/preprocessing/base_image_augmentation_layer.py @@ -22,7 +22,8 @@ from keras_cv import bounding_box from keras_cv.api_export import keras_cv_export -from keras_cv.backend import keras, scope +from keras_cv.backend import keras +from keras_cv.backend import scope from keras_cv.backend.config import multi_backend from keras_cv.utils import preprocessing diff --git a/keras_cv/layers/preprocessing_3d/base_augmentation_layer_3d.py b/keras_cv/layers/preprocessing_3d/base_augmentation_layer_3d.py index 3e9fd5df83..c31eda14c6 100644 --- a/keras_cv/layers/preprocessing_3d/base_augmentation_layer_3d.py +++ b/keras_cv/layers/preprocessing_3d/base_augmentation_layer_3d.py @@ -13,16 +13,14 @@ # limitations under the License. import tensorflow as tf + from keras_cv.api_export import keras_cv_export from keras_cv.backend.config import detect_if_tensorflow_uses_keras_3 -from tensorflow import keras if detect_if_tensorflow_uses_keras_3(): base_layer = tf.keras.layers.Layer else: - from tensorflow.keras.__internal__.layers import BaseRandomLayer - - base_layer = BaseRandomLayer + base_layer = tf.keras.__internal__.layers.BaseRandomLayer POINT_CLOUDS = "point_clouds" BOUNDING_BOXES = "bounding_boxes" diff --git a/keras_cv/layers/regularization/dropblock_2d.py b/keras_cv/layers/regularization/dropblock_2d.py index 96f657ba95..569275d09e 100644 --- a/keras_cv/layers/regularization/dropblock_2d.py +++ b/keras_cv/layers/regularization/dropblock_2d.py @@ -13,6 +13,7 @@ # limitations under the License. import tensorflow as tf + from keras_cv.backend.config import detect_if_tensorflow_uses_keras_3 if detect_if_tensorflow_uses_keras_3(): From 2248682524719d038bee92ade4106245c8f3b67e Mon Sep 17 00:00:00 2001 From: divyashreepathihalli Date: Wed, 8 Nov 2023 07:47:07 +0000 Subject: [PATCH 35/54] reformat and add backend functions --- keras_cv/backend/__init__.py | 8 ++++++++ .../layers/preprocessing_3d/base_augmentation_layer_3d.py | 2 +- keras_cv/layers/regularization/dropblock_2d.py | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/keras_cv/backend/__init__.py b/keras_cv/backend/__init__.py index 890073a1eb..bb4cf4dcda 100644 --- a/keras_cv/backend/__init__.py +++ b/keras_cv/backend/__init__.py @@ -28,3 +28,11 @@ def assert_tf_keras(src): def supports_ragged(): return not config.multi_backend() + + +def multi_backend(): + return config.multi_backend() + + +def detect_if_tensorflow_uses_keras_3(): + return config.detect_if_tensorflow_uses_keras_3() diff --git a/keras_cv/layers/preprocessing_3d/base_augmentation_layer_3d.py b/keras_cv/layers/preprocessing_3d/base_augmentation_layer_3d.py index c31eda14c6..3d48fc225d 100644 --- a/keras_cv/layers/preprocessing_3d/base_augmentation_layer_3d.py +++ b/keras_cv/layers/preprocessing_3d/base_augmentation_layer_3d.py @@ -15,7 +15,7 @@ import tensorflow as tf from keras_cv.api_export import keras_cv_export -from keras_cv.backend.config import detect_if_tensorflow_uses_keras_3 +from keras_cv.backend import detect_if_tensorflow_uses_keras_3 if detect_if_tensorflow_uses_keras_3(): base_layer = tf.keras.layers.Layer diff --git a/keras_cv/layers/regularization/dropblock_2d.py b/keras_cv/layers/regularization/dropblock_2d.py index 569275d09e..ba59165a62 100644 --- a/keras_cv/layers/regularization/dropblock_2d.py +++ b/keras_cv/layers/regularization/dropblock_2d.py @@ -14,7 +14,7 @@ import tensorflow as tf -from keras_cv.backend.config import detect_if_tensorflow_uses_keras_3 +from keras_cv.backend import detect_if_tensorflow_uses_keras_3 if detect_if_tensorflow_uses_keras_3(): base_layer = tf.keras.layers.Layer From 0f5ec94b8212079ed0f0d1fe552a8be173da448e Mon Sep 17 00:00:00 2001 From: divyashreepathihalli Date: Wed, 8 Nov 2023 08:09:16 +0000 Subject: [PATCH 36/54] modified ops import --- keras_cv/backend/ops.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/keras_cv/backend/ops.py b/keras_cv/backend/ops.py index f9f1f43a93..aecf4eda62 100644 --- a/keras_cv/backend/ops.py +++ b/keras_cv/backend/ops.py @@ -11,9 +11,18 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -from keras_cv.backend.config import multi_backend +from keras_cv.backend.config import ( + detect_if_tensorflow_uses_keras_3, + multi_backend, +) -if multi_backend(): +if detect_if_tensorflow_uses_keras_3(): + from tensorflow.keras.backend import vectorized_map # noqa: F403, F401 + from tensorflow.keras.ops import * # noqa: F403, F401 + from tensorflow.keras.utils.image_utils import ( + smart_resize, + ) # noqa: F403, F401 +elif multi_backend(): try: from keras.src.backend import vectorized_map # noqa: F403, F401 from keras.src.ops import * # noqa: F403, F401 @@ -22,8 +31,8 @@ except ImportError: from keras_core.src.backend import vectorized_map # noqa: F403, F401 from keras_core.src.ops import * # noqa: F403, F401 - from keras_core.src.utils.image_utils import ( # noqa: F403, F401 + from keras_core.src.utils.image_utils import ( smart_resize, - ) + ) # noqa: F403, F401 else: from keras_cv.backend.tf_ops import * # noqa: F403, F401 From 9c442c98ff620e98edd8104f5ac53e8df1305981 Mon Sep 17 00:00:00 2001 From: divyashreepathihalli Date: Wed, 8 Nov 2023 08:13:56 +0000 Subject: [PATCH 37/54] reformat --- keras_cv/backend/ops.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/keras_cv/backend/ops.py b/keras_cv/backend/ops.py index aecf4eda62..e1986c82b6 100644 --- a/keras_cv/backend/ops.py +++ b/keras_cv/backend/ops.py @@ -11,17 +11,15 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -from keras_cv.backend.config import ( - detect_if_tensorflow_uses_keras_3, - multi_backend, -) +from keras_cv.backend.config import detect_if_tensorflow_uses_keras_3 +from keras_cv.backend.config import multi_backend if detect_if_tensorflow_uses_keras_3(): from tensorflow.keras.backend import vectorized_map # noqa: F403, F401 from tensorflow.keras.ops import * # noqa: F403, F401 - from tensorflow.keras.utils.image_utils import ( + from tensorflow.keras.utils.image_utils import ( # noqa: F403, F401 smart_resize, - ) # noqa: F403, F401 + ) elif multi_backend(): try: from keras.src.backend import vectorized_map # noqa: F403, F401 @@ -31,8 +29,8 @@ except ImportError: from keras_core.src.backend import vectorized_map # noqa: F403, F401 from keras_core.src.ops import * # noqa: F403, F401 - from keras_core.src.utils.image_utils import ( + from keras_core.src.utils.image_utils import ( # noqa: F403, F401 smart_resize, - ) # noqa: F403, F401 + ) else: from keras_cv.backend.tf_ops import * # noqa: F403, F401 From b9711aaea677965189431e98633f6a95bd9f5082 Mon Sep 17 00:00:00 2001 From: divyashreepathihalli Date: Wed, 8 Nov 2023 08:33:31 +0000 Subject: [PATCH 38/54] update ops --- keras_cv/backend/__init__.py | 4 ++++ keras_cv/backend/config.py | 14 ++++++++++++++ keras_cv/backend/ops.py | 6 +++--- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/keras_cv/backend/__init__.py b/keras_cv/backend/__init__.py index bb4cf4dcda..1e887897c1 100644 --- a/keras_cv/backend/__init__.py +++ b/keras_cv/backend/__init__.py @@ -36,3 +36,7 @@ def multi_backend(): def detect_if_tensorflow_uses_keras_3(): return config.detect_if_tensorflow_uses_keras_3() + + +def backend(): + return config.backend() diff --git a/keras_cv/backend/config.py b/keras_cv/backend/config.py index c99a566831..91607de867 100644 --- a/keras_cv/backend/config.py +++ b/keras_cv/backend/config.py @@ -78,3 +78,17 @@ def detect_if_tensorflow_uses_keras_3(): def multi_backend(): return _MULTI_BACKEND + + +def backend(): + """Check the backend framework.""" + if not multi_backend(): + return "tensorflow" + if not detect_if_tensorflow_uses_keras_3(): + import keras_core + + return keras_core.config.backend() + + from tensorflow import keras + + return keras.config.backend() diff --git a/keras_cv/backend/ops.py b/keras_cv/backend/ops.py index e1986c82b6..8e6c00f96b 100644 --- a/keras_cv/backend/ops.py +++ b/keras_cv/backend/ops.py @@ -11,8 +11,8 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. +from keras_cv.backend.config import backend from keras_cv.backend.config import detect_if_tensorflow_uses_keras_3 -from keras_cv.backend.config import multi_backend if detect_if_tensorflow_uses_keras_3(): from tensorflow.keras.backend import vectorized_map # noqa: F403, F401 @@ -20,7 +20,7 @@ from tensorflow.keras.utils.image_utils import ( # noqa: F403, F401 smart_resize, ) -elif multi_backend(): +else: try: from keras.src.backend import vectorized_map # noqa: F403, F401 from keras.src.ops import * # noqa: F403, F401 @@ -32,5 +32,5 @@ from keras_core.src.utils.image_utils import ( # noqa: F403, F401 smart_resize, ) -else: +if backend() == "Tensorflow": from keras_cv.backend.tf_ops import * # noqa: F403, F401 From c473fe3a80ec04a48334f053c2c05fb5cf00c727 Mon Sep 17 00:00:00 2001 From: divyashreepathihalli Date: Wed, 8 Nov 2023 08:40:56 +0000 Subject: [PATCH 39/54] update backend --- keras_cv/backend/__init__.py | 4 ---- keras_cv/backend/ops.py | 4 ++-- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/keras_cv/backend/__init__.py b/keras_cv/backend/__init__.py index 1e887897c1..bb4cf4dcda 100644 --- a/keras_cv/backend/__init__.py +++ b/keras_cv/backend/__init__.py @@ -36,7 +36,3 @@ def multi_backend(): def detect_if_tensorflow_uses_keras_3(): return config.detect_if_tensorflow_uses_keras_3() - - -def backend(): - return config.backend() diff --git a/keras_cv/backend/ops.py b/keras_cv/backend/ops.py index 8e6c00f96b..187271c94f 100644 --- a/keras_cv/backend/ops.py +++ b/keras_cv/backend/ops.py @@ -11,7 +11,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -from keras_cv.backend.config import backend +from keras_cv.backend import config from keras_cv.backend.config import detect_if_tensorflow_uses_keras_3 if detect_if_tensorflow_uses_keras_3(): @@ -32,5 +32,5 @@ from keras_core.src.utils.image_utils import ( # noqa: F403, F401 smart_resize, ) -if backend() == "Tensorflow": +if config.backend() == "Tensorflow": from keras_cv.backend.tf_ops import * # noqa: F403, F401 From ff9ce2b5e1711bfbbe26e2a3903384c149be9298 Mon Sep 17 00:00:00 2001 From: divyashreepathihalli Date: Wed, 8 Nov 2023 16:41:58 +0000 Subject: [PATCH 40/54] update ops --- keras_cv/backend/ops.py | 4 ++-- keras_cv/backend/tf_ops.py | 13 ++++++++----- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/keras_cv/backend/ops.py b/keras_cv/backend/ops.py index 187271c94f..85cb92fe04 100644 --- a/keras_cv/backend/ops.py +++ b/keras_cv/backend/ops.py @@ -11,8 +11,8 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -from keras_cv.backend import config from keras_cv.backend.config import detect_if_tensorflow_uses_keras_3 +from keras_cv.backend.config import multi_backend if detect_if_tensorflow_uses_keras_3(): from tensorflow.keras.backend import vectorized_map # noqa: F403, F401 @@ -32,5 +32,5 @@ from keras_core.src.utils.image_utils import ( # noqa: F403, F401 smart_resize, ) -if config.backend() == "Tensorflow": +if not multi_backend(): from keras_cv.backend.tf_ops import * # noqa: F403, F401 diff --git a/keras_cv/backend/tf_ops.py b/keras_cv/backend/tf_ops.py index 2648f1b2d7..a3b6bd7d53 100644 --- a/keras_cv/backend/tf_ops.py +++ b/keras_cv/backend/tf_ops.py @@ -15,9 +15,9 @@ if config.multi_backend(): from keras_core.src.backend.tensorflow import * # noqa: F403, F401 - from keras_core.src.backend.tensorflow import ( # noqa: F403, F401 + from keras_core.src.backend.tensorflow import ( convert_to_numpy, - ) + ) # noqa: F403, F401 from keras_core.src.backend.tensorflow.core import * # noqa: F403, F401 from keras_core.src.backend.tensorflow.math import * # noqa: F403, F401 from keras_core.src.backend.tensorflow.nn import * # noqa: F403, F401 @@ -25,10 +25,13 @@ # Some TF APIs where the numpy API doesn't support raggeds that we need from tensorflow import broadcast_to # noqa: F403, F401 +from tensorflow import repeat # noqa: F403, F401 +from tensorflow import reshape # noqa: F403, F401 +from tensorflow import split # noqa: F403, F401 from tensorflow import concat as concatenate # noqa: F403, F401 from tensorflow import range as arange # noqa: F403, F401 from tensorflow import reduce_all as all # noqa: F403, F401 from tensorflow import reduce_max as max # noqa: F403, F401 -from tensorflow import repeat # noqa: F403, F401 -from tensorflow import reshape # noqa: F403, F401 -from tensorflow import split # noqa: F403, F401 +from tensorflow.keras.preprocessing.image import ( + smart_resize, +) # noqa: F403, F401 From 28341639caf1449eaef18ae6480b708a836aeb80 Mon Sep 17 00:00:00 2001 From: divyashreepathihalli Date: Wed, 8 Nov 2023 16:49:21 +0000 Subject: [PATCH 41/54] code reformatted --- keras_cv/backend/tf_ops.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/keras_cv/backend/tf_ops.py b/keras_cv/backend/tf_ops.py index a3b6bd7d53..794ab9462e 100644 --- a/keras_cv/backend/tf_ops.py +++ b/keras_cv/backend/tf_ops.py @@ -15,9 +15,9 @@ if config.multi_backend(): from keras_core.src.backend.tensorflow import * # noqa: F403, F401 - from keras_core.src.backend.tensorflow import ( + from keras_core.src.backend.tensorflow import ( # noqa: F403, F401 convert_to_numpy, - ) # noqa: F403, F401 + ) from keras_core.src.backend.tensorflow.core import * # noqa: F403, F401 from keras_core.src.backend.tensorflow.math import * # noqa: F403, F401 from keras_core.src.backend.tensorflow.nn import * # noqa: F403, F401 @@ -25,13 +25,13 @@ # Some TF APIs where the numpy API doesn't support raggeds that we need from tensorflow import broadcast_to # noqa: F403, F401 -from tensorflow import repeat # noqa: F403, F401 -from tensorflow import reshape # noqa: F403, F401 -from tensorflow import split # noqa: F403, F401 from tensorflow import concat as concatenate # noqa: F403, F401 from tensorflow import range as arange # noqa: F403, F401 from tensorflow import reduce_all as all # noqa: F403, F401 from tensorflow import reduce_max as max # noqa: F403, F401 -from tensorflow.keras.preprocessing.image import ( +from tensorflow import repeat # noqa: F403, F401 +from tensorflow import reshape # noqa: F403, F401 +from tensorflow import split # noqa: F403, F401 +from tensorflow.keras.preprocessing.image import ( # noqa: F403, F401 smart_resize, -) # noqa: F403, F401 +) From 7982abd6dacdb40b546b86d2dcb491a35edcd15e Mon Sep 17 00:00:00 2001 From: divyashreepathihalli Date: Wed, 8 Nov 2023 18:41:23 +0000 Subject: [PATCH 42/54] update import --- keras_cv/backend/ops.py | 2 -- keras_cv/layers/preprocessing_3d/base_augmentation_layer_3d.py | 2 +- keras_cv/layers/regularization/dropblock_2d.py | 2 +- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/keras_cv/backend/ops.py b/keras_cv/backend/ops.py index 85cb92fe04..c7bf86ebd6 100644 --- a/keras_cv/backend/ops.py +++ b/keras_cv/backend/ops.py @@ -15,14 +15,12 @@ from keras_cv.backend.config import multi_backend if detect_if_tensorflow_uses_keras_3(): - from tensorflow.keras.backend import vectorized_map # noqa: F403, F401 from tensorflow.keras.ops import * # noqa: F403, F401 from tensorflow.keras.utils.image_utils import ( # noqa: F403, F401 smart_resize, ) else: try: - from keras.src.backend import vectorized_map # noqa: F403, F401 from keras.src.ops import * # noqa: F403, F401 from keras.src.utils.image_utils import smart_resize # noqa: F403, F401 # Import error means Keras isn't installed, or is Keras 2. diff --git a/keras_cv/layers/preprocessing_3d/base_augmentation_layer_3d.py b/keras_cv/layers/preprocessing_3d/base_augmentation_layer_3d.py index 3d48fc225d..dfa7fc2a18 100644 --- a/keras_cv/layers/preprocessing_3d/base_augmentation_layer_3d.py +++ b/keras_cv/layers/preprocessing_3d/base_augmentation_layer_3d.py @@ -105,7 +105,7 @@ def augment_pointclouds(self, point_clouds, transformation): def __init__(self, seed=None, **kwargs): if detect_if_tensorflow_uses_keras_3(): - pass + raise ValueError("This layer is not available in keras 3 yet.") else: super().__init__(seed=seed, **kwargs) self.auto_vectorize = False diff --git a/keras_cv/layers/regularization/dropblock_2d.py b/keras_cv/layers/regularization/dropblock_2d.py index ba59165a62..a241d234e6 100644 --- a/keras_cv/layers/regularization/dropblock_2d.py +++ b/keras_cv/layers/regularization/dropblock_2d.py @@ -154,7 +154,7 @@ def __init__( **kwargs, ): if detect_if_tensorflow_uses_keras_3(): - pass + raise ValueError("This layer is not available in keras 3 yet.") else: super().__init__(seed=seed, **kwargs) if not 0.0 <= rate <= 1.0: From 40fdd1ff094971db82e93d31b1572c27462ad84d Mon Sep 17 00:00:00 2001 From: divyashreepathihalli Date: Wed, 8 Nov 2023 18:48:29 +0000 Subject: [PATCH 43/54] update imports in ops --- keras_cv/backend/ops.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keras_cv/backend/ops.py b/keras_cv/backend/ops.py index c7bf86ebd6..798f9f99f7 100644 --- a/keras_cv/backend/ops.py +++ b/keras_cv/backend/ops.py @@ -16,7 +16,7 @@ if detect_if_tensorflow_uses_keras_3(): from tensorflow.keras.ops import * # noqa: F403, F401 - from tensorflow.keras.utils.image_utils import ( # noqa: F403, F401 + from tensorflow.keras.preprocessing.image import ( # noqa: F403, F401 smart_resize, ) else: From 4a5dd670d23d109ef23d240d8a7dfbe2e6b149dc Mon Sep 17 00:00:00 2001 From: divyashreepathihalli Date: Wed, 8 Nov 2023 19:14:51 +0000 Subject: [PATCH 44/54] update error message --- .../layers/preprocessing_3d/base_augmentation_layer_3d.py | 5 ++++- keras_cv/layers/regularization/dropblock_2d.py | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/keras_cv/layers/preprocessing_3d/base_augmentation_layer_3d.py b/keras_cv/layers/preprocessing_3d/base_augmentation_layer_3d.py index dfa7fc2a18..c97ceca381 100644 --- a/keras_cv/layers/preprocessing_3d/base_augmentation_layer_3d.py +++ b/keras_cv/layers/preprocessing_3d/base_augmentation_layer_3d.py @@ -105,7 +105,10 @@ def augment_pointclouds(self, point_clouds, transformation): def __init__(self, seed=None, **kwargs): if detect_if_tensorflow_uses_keras_3(): - raise ValueError("This layer is not available in keras 3 yet.") + raise ValueError( + "This layer is not yet compatible with Keras 3." + "Please switch to Keras 2 to use this layer." + ) else: super().__init__(seed=seed, **kwargs) self.auto_vectorize = False diff --git a/keras_cv/layers/regularization/dropblock_2d.py b/keras_cv/layers/regularization/dropblock_2d.py index a241d234e6..36392f1ecf 100644 --- a/keras_cv/layers/regularization/dropblock_2d.py +++ b/keras_cv/layers/regularization/dropblock_2d.py @@ -154,7 +154,10 @@ def __init__( **kwargs, ): if detect_if_tensorflow_uses_keras_3(): - raise ValueError("This layer is not available in keras 3 yet.") + raise ValueError( + "This layer is not yet compatible with Keras 3." + "Please switch to Keras 2 to use this layer." + ) else: super().__init__(seed=seed, **kwargs) if not 0.0 <= rate <= 1.0: From 499615b1b49dd0985eefa06509a88a7b9d1148a0 Mon Sep 17 00:00:00 2001 From: divyashreepathihalli Date: Wed, 8 Nov 2023 21:34:44 +0000 Subject: [PATCH 45/54] review changes added --- keras_cv/backend/__init__.py | 8 ---- keras_cv/backend/ops.py | 6 +-- keras_cv/backend/tf_ops.py | 37 ++++++++++++------- .../base_augmentation_layer_3d.py | 3 +- .../layers/regularization/dropblock_2d.py | 2 +- 5 files changed, 28 insertions(+), 28 deletions(-) diff --git a/keras_cv/backend/__init__.py b/keras_cv/backend/__init__.py index bb4cf4dcda..890073a1eb 100644 --- a/keras_cv/backend/__init__.py +++ b/keras_cv/backend/__init__.py @@ -28,11 +28,3 @@ def assert_tf_keras(src): def supports_ragged(): return not config.multi_backend() - - -def multi_backend(): - return config.multi_backend() - - -def detect_if_tensorflow_uses_keras_3(): - return config.detect_if_tensorflow_uses_keras_3() diff --git a/keras_cv/backend/ops.py b/keras_cv/backend/ops.py index 798f9f99f7..e8b1a78635 100644 --- a/keras_cv/backend/ops.py +++ b/keras_cv/backend/ops.py @@ -15,10 +15,8 @@ from keras_cv.backend.config import multi_backend if detect_if_tensorflow_uses_keras_3(): - from tensorflow.keras.ops import * # noqa: F403, F401 - from tensorflow.keras.preprocessing.image import ( # noqa: F403, F401 - smart_resize, - ) + from keras.ops import * # noqa: F403, F401 + from keras.preprocessing.image import smart_resize # noqa: F403, F401 else: try: from keras.src.ops import * # noqa: F403, F401 diff --git a/keras_cv/backend/tf_ops.py b/keras_cv/backend/tf_ops.py index 794ab9462e..66612eee6b 100644 --- a/keras_cv/backend/tf_ops.py +++ b/keras_cv/backend/tf_ops.py @@ -14,24 +14,35 @@ from keras_cv.backend import config if config.multi_backend(): - from keras_core.src.backend.tensorflow import * # noqa: F403, F401 - from keras_core.src.backend.tensorflow import ( # noqa: F403, F401 - convert_to_numpy, - ) - from keras_core.src.backend.tensorflow.core import * # noqa: F403, F401 - from keras_core.src.backend.tensorflow.math import * # noqa: F403, F401 - from keras_core.src.backend.tensorflow.nn import * # noqa: F403, F401 - from keras_core.src.backend.tensorflow.numpy import * # noqa: F403, F401 + try: + from keras.backend.tensorflow import * # noqa: F403, F401 + from keras.backend.tensorflow import ( + convert_to_numpy, + ) # noqa: F403, F401 + from keras.backend.tensorflow.core import * # noqa: F403, F401 + from keras.backend.tensorflow.math import * # noqa: F403, F401 + from keras.backend.tensorflow.nn import * # noqa: F403, F401 + from keras.backend.tensorflow.numpy import * # noqa: F403, F401 + except ImportError: + from keras_core.src.backend.tensorflow import * # noqa: F403, F401 + from keras_core.src.backend.tensorflow import ( + convert_to_numpy, + ) # noqa: F403, F401 + from keras_core.src.backend.tensorflow.core import * # noqa: F403, F401 + from keras_core.src.backend.tensorflow.math import * # noqa: F403, F401 + from keras_core.src.backend.tensorflow.nn import * # noqa: F403, F401 + from keras_core.src.backend.tensorflow.numpy import * # noqa: F403, F401 , E501 + # Some TF APIs where the numpy API doesn't support raggeds that we need from tensorflow import broadcast_to # noqa: F403, F401 +from tensorflow import repeat # noqa: F403, F401 +from tensorflow import reshape # noqa: F403, F401 +from tensorflow import split # noqa: F403, F401 from tensorflow import concat as concatenate # noqa: F403, F401 from tensorflow import range as arange # noqa: F403, F401 from tensorflow import reduce_all as all # noqa: F403, F401 from tensorflow import reduce_max as max # noqa: F403, F401 -from tensorflow import repeat # noqa: F403, F401 -from tensorflow import reshape # noqa: F403, F401 -from tensorflow import split # noqa: F403, F401 -from tensorflow.keras.preprocessing.image import ( # noqa: F403, F401 +from tensorflow.keras.preprocessing.image import ( smart_resize, -) +) # noqa: F403, F401 diff --git a/keras_cv/layers/preprocessing_3d/base_augmentation_layer_3d.py b/keras_cv/layers/preprocessing_3d/base_augmentation_layer_3d.py index c97ceca381..7a78813b03 100644 --- a/keras_cv/layers/preprocessing_3d/base_augmentation_layer_3d.py +++ b/keras_cv/layers/preprocessing_3d/base_augmentation_layer_3d.py @@ -13,9 +13,8 @@ # limitations under the License. import tensorflow as tf - from keras_cv.api_export import keras_cv_export -from keras_cv.backend import detect_if_tensorflow_uses_keras_3 +from keras_cv.backend.config import detect_if_tensorflow_uses_keras_3 if detect_if_tensorflow_uses_keras_3(): base_layer = tf.keras.layers.Layer diff --git a/keras_cv/layers/regularization/dropblock_2d.py b/keras_cv/layers/regularization/dropblock_2d.py index 36392f1ecf..7d03393795 100644 --- a/keras_cv/layers/regularization/dropblock_2d.py +++ b/keras_cv/layers/regularization/dropblock_2d.py @@ -14,7 +14,7 @@ import tensorflow as tf -from keras_cv.backend import detect_if_tensorflow_uses_keras_3 +from keras_cv.backend.config import detect_if_tensorflow_uses_keras_3 if detect_if_tensorflow_uses_keras_3(): base_layer = tf.keras.layers.Layer From 45685ddf0cac2fdea6ebe036c8998ac8ad7ff86d Mon Sep 17 00:00:00 2001 From: divyashreepathihalli Date: Wed, 8 Nov 2023 21:46:24 +0000 Subject: [PATCH 46/54] update keras imports --- keras_cv/backend/random.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/keras_cv/backend/random.py b/keras_cv/backend/random.py index 21d4b08c7d..a41c0b21a7 100644 --- a/keras_cv/backend/random.py +++ b/keras_cv/backend/random.py @@ -15,6 +15,9 @@ from keras_cv.backend.config import multi_backend if multi_backend(): - from keras_core.random import * # noqa: F403, F401 + try: + from keras.random import * # noqa: F403, F401 + except ImportError: + from keras_core.random import * # noqa: F403, F401 else: - from keras_core.src.backend.tensorflow.random import * # noqa: F403, F401 + from keras.src.backend.tensorflow.random import * # noqa: F403, F401 From ec9f545d570e108fcf74c788b9b05dee89bca321 Mon Sep 17 00:00:00 2001 From: divyashreepathihalli Date: Wed, 8 Nov 2023 21:49:50 +0000 Subject: [PATCH 47/54] update imports --- keras_cv/backend/tf_ops.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/keras_cv/backend/tf_ops.py b/keras_cv/backend/tf_ops.py index 66612eee6b..6d48a9feed 100644 --- a/keras_cv/backend/tf_ops.py +++ b/keras_cv/backend/tf_ops.py @@ -15,14 +15,14 @@ if config.multi_backend(): try: - from keras.backend.tensorflow import * # noqa: F403, F401 - from keras.backend.tensorflow import ( + from tensorflow.keras.backend.tensorflow import * # noqa: F403, F401 + from tensorflow.keras.backend.tensorflow import ( convert_to_numpy, ) # noqa: F403, F401 - from keras.backend.tensorflow.core import * # noqa: F403, F401 - from keras.backend.tensorflow.math import * # noqa: F403, F401 - from keras.backend.tensorflow.nn import * # noqa: F403, F401 - from keras.backend.tensorflow.numpy import * # noqa: F403, F401 + from tensorflow.keras.backend.tensorflow.core import * # noqa: F403, F401 + from tensorflow.keras.backend.tensorflow.math import * # noqa: F403, F401 + from tensorflow.keras.backend.tensorflow.nn import * # noqa: F403, F401 + from tensorflow.keras.backend.tensorflow.numpy import * # noqa: F403, F401 except ImportError: from keras_core.src.backend.tensorflow import * # noqa: F403, F401 from keras_core.src.backend.tensorflow import ( From 07c6f38194ae8f8f0c051a6a488d7a3c77f2dec3 Mon Sep 17 00:00:00 2001 From: divyashreepathihalli Date: Wed, 8 Nov 2023 21:56:30 +0000 Subject: [PATCH 48/54] update imports --- keras_cv/backend/tf_ops.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/keras_cv/backend/tf_ops.py b/keras_cv/backend/tf_ops.py index 6d48a9feed..d5b9786c0f 100644 --- a/keras_cv/backend/tf_ops.py +++ b/keras_cv/backend/tf_ops.py @@ -15,14 +15,14 @@ if config.multi_backend(): try: - from tensorflow.keras.backend.tensorflow import * # noqa: F403, F401 - from tensorflow.keras.backend.tensorflow import ( + from keras.src.backend.tensorflow import * # noqa: F403, F401 + from keras.src.backend.tensorflow import ( convert_to_numpy, ) # noqa: F403, F401 - from tensorflow.keras.backend.tensorflow.core import * # noqa: F403, F401 - from tensorflow.keras.backend.tensorflow.math import * # noqa: F403, F401 - from tensorflow.keras.backend.tensorflow.nn import * # noqa: F403, F401 - from tensorflow.keras.backend.tensorflow.numpy import * # noqa: F403, F401 + from keras.src.backend.tensorflow.core import * # noqa: F403, F401 + from keras.src.backend.tensorflow.math import * # noqa: F403, F401 + from keras.src.backend.tensorflow.nn import * # noqa: F403, F401 + from keras.src.backend.tensorflow.numpy import * # noqa: F403, F401 except ImportError: from keras_core.src.backend.tensorflow import * # noqa: F403, F401 from keras_core.src.backend.tensorflow import ( From 3d44a287ea304897b46ea485c7e80ff500c5b399 Mon Sep 17 00:00:00 2001 From: divyashreepathihalli Date: Wed, 8 Nov 2023 22:14:12 +0000 Subject: [PATCH 49/54] update import in random.py --- keras_cv/backend/random.py | 2 +- .../layers/preprocessing_3d/base_augmentation_layer_3d.py | 1 + keras_cv/models/object_detection/retinanet/retinanet_test.py | 5 ++++- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/keras_cv/backend/random.py b/keras_cv/backend/random.py index a41c0b21a7..ec711e80fa 100644 --- a/keras_cv/backend/random.py +++ b/keras_cv/backend/random.py @@ -20,4 +20,4 @@ except ImportError: from keras_core.random import * # noqa: F403, F401 else: - from keras.src.backend.tensorflow.random import * # noqa: F403, F401 + from tensorflow.random import * # noqa: F403, F401 diff --git a/keras_cv/layers/preprocessing_3d/base_augmentation_layer_3d.py b/keras_cv/layers/preprocessing_3d/base_augmentation_layer_3d.py index 7a78813b03..f20c7d9674 100644 --- a/keras_cv/layers/preprocessing_3d/base_augmentation_layer_3d.py +++ b/keras_cv/layers/preprocessing_3d/base_augmentation_layer_3d.py @@ -13,6 +13,7 @@ # limitations under the License. import tensorflow as tf + from keras_cv.api_export import keras_cv_export from keras_cv.backend.config import detect_if_tensorflow_uses_keras_3 diff --git a/keras_cv/models/object_detection/retinanet/retinanet_test.py b/keras_cv/models/object_detection/retinanet/retinanet_test.py index 45026262f4..b2ef4f093b 100644 --- a/keras_cv/models/object_detection/retinanet/retinanet_test.py +++ b/keras_cv/models/object_detection/retinanet/retinanet_test.py @@ -251,7 +251,10 @@ def test_call_with_custom_label_encoder(self): model(ops.ones(shape=(2, 224, 224, 3))) def test_tf_dataset_data_generator(self): - if backend.multi_backend() and keras.backend.backend() != "tensorflow": + if ( + backend.config.multi_backend() + and keras.backend.backend() != "tensorflow" + ): pytest.skip("TensorFlow required for `tf.data.Dataset` test.") def data_generator(): From b0317ba0b7ccdcb8f56f175923aa731d266452ff Mon Sep 17 00:00:00 2001 From: divyashreepathihalli Date: Wed, 8 Nov 2023 22:19:28 +0000 Subject: [PATCH 50/54] add issues link --- keras_cv/layers/preprocessing_3d/base_augmentation_layer_3d.py | 3 ++- keras_cv/layers/regularization/dropblock_2d.py | 3 ++- keras_cv/models/object_detection/predict_utils.py | 1 + 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/keras_cv/layers/preprocessing_3d/base_augmentation_layer_3d.py b/keras_cv/layers/preprocessing_3d/base_augmentation_layer_3d.py index f20c7d9674..0f6610c384 100644 --- a/keras_cv/layers/preprocessing_3d/base_augmentation_layer_3d.py +++ b/keras_cv/layers/preprocessing_3d/base_augmentation_layer_3d.py @@ -13,7 +13,6 @@ # limitations under the License. import tensorflow as tf - from keras_cv.api_export import keras_cv_export from keras_cv.backend.config import detect_if_tensorflow_uses_keras_3 @@ -104,6 +103,8 @@ def augment_pointclouds(self, point_clouds, transformation): """ def __init__(self, seed=None, **kwargs): + # To-do: remove this once th elayer is ported to keras 3 + # https://github.com/keras-team/keras-cv/issues/2136 if detect_if_tensorflow_uses_keras_3(): raise ValueError( "This layer is not yet compatible with Keras 3." diff --git a/keras_cv/layers/regularization/dropblock_2d.py b/keras_cv/layers/regularization/dropblock_2d.py index 7d03393795..7d17d519ba 100644 --- a/keras_cv/layers/regularization/dropblock_2d.py +++ b/keras_cv/layers/regularization/dropblock_2d.py @@ -13,7 +13,6 @@ # limitations under the License. import tensorflow as tf - from keras_cv.backend.config import detect_if_tensorflow_uses_keras_3 if detect_if_tensorflow_uses_keras_3(): @@ -153,6 +152,8 @@ def __init__( seed=None, **kwargs, ): + # To-do: remove this once th elayer is ported to keras 3 + # https://github.com/keras-team/keras-cv/issues/2136 if detect_if_tensorflow_uses_keras_3(): raise ValueError( "This layer is not yet compatible with Keras 3." diff --git a/keras_cv/models/object_detection/predict_utils.py b/keras_cv/models/object_detection/predict_utils.py index b354abf8f5..298f38091d 100644 --- a/keras_cv/models/object_detection/predict_utils.py +++ b/keras_cv/models/object_detection/predict_utils.py @@ -16,6 +16,7 @@ try: # To-do: these imports need to fixed - Issue 2134 + # https://github.com/keras-team/keras-cv/issues/2134 # from keras.src.engine.training import _minimum_control_deps # from keras.src.engine.training import reduce_per_replica from keras.src.utils import tf_utils From 8a0b3ae29dc27f9ad857a7056026b1a3230f51e7 Mon Sep 17 00:00:00 2001 From: divyashreepathihalli Date: Wed, 8 Nov 2023 22:37:27 +0000 Subject: [PATCH 51/54] code reformat --- keras_cv/layers/preprocessing_3d/base_augmentation_layer_3d.py | 1 + keras_cv/layers/regularization/dropblock_2d.py | 1 + 2 files changed, 2 insertions(+) diff --git a/keras_cv/layers/preprocessing_3d/base_augmentation_layer_3d.py b/keras_cv/layers/preprocessing_3d/base_augmentation_layer_3d.py index 0f6610c384..93de9ec43b 100644 --- a/keras_cv/layers/preprocessing_3d/base_augmentation_layer_3d.py +++ b/keras_cv/layers/preprocessing_3d/base_augmentation_layer_3d.py @@ -13,6 +13,7 @@ # limitations under the License. import tensorflow as tf + from keras_cv.api_export import keras_cv_export from keras_cv.backend.config import detect_if_tensorflow_uses_keras_3 diff --git a/keras_cv/layers/regularization/dropblock_2d.py b/keras_cv/layers/regularization/dropblock_2d.py index 7d17d519ba..25b5bd6206 100644 --- a/keras_cv/layers/regularization/dropblock_2d.py +++ b/keras_cv/layers/regularization/dropblock_2d.py @@ -13,6 +13,7 @@ # limitations under the License. import tensorflow as tf + from keras_cv.backend.config import detect_if_tensorflow_uses_keras_3 if detect_if_tensorflow_uses_keras_3(): From 1cdc7db2515e076d87a08d7b73cffaf02aaa60e0 Mon Sep 17 00:00:00 2001 From: divyashreepathihalli Date: Wed, 8 Nov 2023 22:52:59 +0000 Subject: [PATCH 52/54] code reformat --- keras_cv/backend/tf_ops.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/keras_cv/backend/tf_ops.py b/keras_cv/backend/tf_ops.py index d5b9786c0f..e55fafc328 100644 --- a/keras_cv/backend/tf_ops.py +++ b/keras_cv/backend/tf_ops.py @@ -16,22 +16,23 @@ if config.multi_backend(): try: from keras.src.backend.tensorflow import * # noqa: F403, F401 - from keras.src.backend.tensorflow import ( + from keras.src.backend.tensorflow import ( # noqa: F403, F401 convert_to_numpy, - ) # noqa: F403, F401 + ) from keras.src.backend.tensorflow.core import * # noqa: F403, F401 from keras.src.backend.tensorflow.math import * # noqa: F403, F401 from keras.src.backend.tensorflow.nn import * # noqa: F403, F401 from keras.src.backend.tensorflow.numpy import * # noqa: F403, F401 except ImportError: + # isort: off from keras_core.src.backend.tensorflow import * # noqa: F403, F401 - from keras_core.src.backend.tensorflow import ( + from keras_core.src.backend.tensorflow import ( # noqa: F403, F401 convert_to_numpy, - ) # noqa: F403, F401 + ) from keras_core.src.backend.tensorflow.core import * # noqa: F403, F401 from keras_core.src.backend.tensorflow.math import * # noqa: F403, F401 from keras_core.src.backend.tensorflow.nn import * # noqa: F403, F401 - from keras_core.src.backend.tensorflow.numpy import * # noqa: F403, F401 , E501 + from keras_core.src.backend.tensorflow.numpy import * # noqa: F403, F401, E501 # Some TF APIs where the numpy API doesn't support raggeds that we need @@ -43,6 +44,6 @@ from tensorflow import range as arange # noqa: F403, F401 from tensorflow import reduce_all as all # noqa: F403, F401 from tensorflow import reduce_max as max # noqa: F403, F401 -from tensorflow.keras.preprocessing.image import ( +from tensorflow.keras.preprocessing.image import ( # noqa: F403, F401 smart_resize, -) # noqa: F403, F401 +) From 6040a64c4afb3f9ced32bbaeeb5d4e296cc5fa1c Mon Sep 17 00:00:00 2001 From: divyashreepathihalli Date: Thu, 9 Nov 2023 17:59:24 +0000 Subject: [PATCH 53/54] review comments addressed --- keras_cv/backend/config.py | 11 +++- keras_cv/backend/keras.py | 53 +++++++++++++------ keras_cv/backend/ops.py | 9 ++-- keras_cv/backend/random.py | 11 ++-- keras_cv/backend/tf_ops.py | 44 +++++++-------- .../base_augmentation_layer_3d.py | 6 +-- .../layers/regularization/dropblock_2d.py | 6 +-- .../retinanet/retinanet_test.py | 7 +-- 8 files changed, 84 insertions(+), 63 deletions(-) diff --git a/keras_cv/backend/config.py b/keras_cv/backend/config.py index 91607de867..8d9c520e88 100644 --- a/keras_cv/backend/config.py +++ b/keras_cv/backend/config.py @@ -39,9 +39,16 @@ def detect_if_tensorflow_uses_keras_3(): return False -if detect_if_tensorflow_uses_keras_3(): +_USE_KERAS_3 = detect_if_tensorflow_uses_keras_3() +if _USE_KERAS_3: _MULTI_BACKEND = True + +def keras_3(): + """Check if Keras 3 is being used.""" + return _USE_KERAS_3 + + # Attempt to read KerasCV config file. _config_path = os.path.expanduser(os.path.join(_keras_dir, "keras_cv.json")) if os.path.exists(_config_path): @@ -84,7 +91,7 @@ def backend(): """Check the backend framework.""" if not multi_backend(): return "tensorflow" - if not detect_if_tensorflow_uses_keras_3(): + if not keras_3(): import keras_core return keras_core.config.backend() diff --git a/keras_cv/backend/keras.py b/keras_cv/backend/keras.py index d03a8a55ce..65082573ae 100644 --- a/keras_cv/backend/keras.py +++ b/keras_cv/backend/keras.py @@ -14,11 +14,19 @@ import types -import tensorflow as tf - from keras_cv.backend import config -if config.detect_if_tensorflow_uses_keras_3(): +_KERAS_CORE_ALIASES = { + "utils->saving": [ + "register_keras_serializable", + "deserialize_keras_object", + "serialize_keras_object", + "get_registered_object", + ], + "models->saving": ["load_model"], +} + +if config.keras_3(): import keras # noqa: F403, F401 from keras import * # noqa: F403, F401 @@ -32,18 +40,31 @@ from tensorflow import keras # noqa: F403, F401 from tensorflow.keras import * # noqa: F403, F401 - # Shims to handle symbol renames for older `tf.keras` versions. - if not hasattr(tf.keras, "saving"): - saving = types.SimpleNamespace() - else: - from tensorflow.keras import saving - from tensorflow.keras import utils - - if not hasattr(saving, "deserialize_keras_object"): - saving.deserialize_keras_object = utils.deserialize_keras_object - if not hasattr(saving, "serialize_keras_object"): - saving.serialize_keras_object = utils.serialize_keras_object - if not hasattr(saving, "register_keras_serializable"): - saving.register_keras_serializable = utils.register_keras_serializable + if not hasattr(keras, "saving"): + keras.saving = types.SimpleNamespace() + + # add aliases + for key, value in _KERAS_CORE_ALIASES.items(): + src, _, dst = key.partition("->") + src = src.split(".") + dst = dst.split(".") + + src_mod, dst_mod = keras, keras + + # navigate to where we want to alias the attributes + for mod in src: + src_mod = getattr(src_mod, mod) + for mod in dst: + dst_mod = getattr(dst_mod, mod) + + # add an alias for each attribute + for attr in value: + if isinstance(attr, tuple): + src_attr, dst_attr = attr + else: + src_attr, dst_attr = attr, attr + attr_val = getattr(src_mod, src_attr) + setattr(dst_mod, dst_attr, attr_val) + # TF Keras doesn't have this rename. keras.activations.silu = keras.activations.swish diff --git a/keras_cv/backend/ops.py b/keras_cv/backend/ops.py index e8b1a78635..a53021f9ba 100644 --- a/keras_cv/backend/ops.py +++ b/keras_cv/backend/ops.py @@ -11,10 +11,9 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -from keras_cv.backend.config import detect_if_tensorflow_uses_keras_3 -from keras_cv.backend.config import multi_backend +from keras_cv.backend.config import keras_3, multi_backend -if detect_if_tensorflow_uses_keras_3(): +if keras_3(): from keras.ops import * # noqa: F403, F401 from keras.preprocessing.image import smart_resize # noqa: F403, F401 else: @@ -25,8 +24,8 @@ except ImportError: from keras_core.src.backend import vectorized_map # noqa: F403, F401 from keras_core.src.ops import * # noqa: F403, F401 - from keras_core.src.utils.image_utils import ( # noqa: F403, F401 + from keras_core.src.utils.image_utils import ( smart_resize, - ) + ) # noqa: F403, F401 if not multi_backend(): from keras_cv.backend.tf_ops import * # noqa: F403, F401 diff --git a/keras_cv/backend/random.py b/keras_cv/backend/random.py index ec711e80fa..d1d88cd715 100644 --- a/keras_cv/backend/random.py +++ b/keras_cv/backend/random.py @@ -12,12 +12,9 @@ # See the License for the specific language governing permissions and # limitations under the License. -from keras_cv.backend.config import multi_backend +from keras_cv.backend.config import keras_3 -if multi_backend(): - try: - from keras.random import * # noqa: F403, F401 - except ImportError: - from keras_core.random import * # noqa: F403, F401 +if keras_3(): + from keras.random import * # noqa: F403, F401 else: - from tensorflow.random import * # noqa: F403, F401 + from keras_core.random import * # noqa: F403, F401 diff --git a/keras_cv/backend/tf_ops.py b/keras_cv/backend/tf_ops.py index e55fafc328..b29d627b56 100644 --- a/keras_cv/backend/tf_ops.py +++ b/keras_cv/backend/tf_ops.py @@ -13,37 +13,37 @@ # limitations under the License. from keras_cv.backend import config -if config.multi_backend(): - try: - from keras.src.backend.tensorflow import * # noqa: F403, F401 - from keras.src.backend.tensorflow import ( # noqa: F403, F401 - convert_to_numpy, - ) - from keras.src.backend.tensorflow.core import * # noqa: F403, F401 - from keras.src.backend.tensorflow.math import * # noqa: F403, F401 - from keras.src.backend.tensorflow.nn import * # noqa: F403, F401 - from keras.src.backend.tensorflow.numpy import * # noqa: F403, F401 - except ImportError: - # isort: off - from keras_core.src.backend.tensorflow import * # noqa: F403, F401 - from keras_core.src.backend.tensorflow import ( # noqa: F403, F401 - convert_to_numpy, - ) - from keras_core.src.backend.tensorflow.core import * # noqa: F403, F401 - from keras_core.src.backend.tensorflow.math import * # noqa: F403, F401 - from keras_core.src.backend.tensorflow.nn import * # noqa: F403, F401 - from keras_core.src.backend.tensorflow.numpy import * # noqa: F403, F401, E501 +if config.keras_3(): + from keras.src.backend.tensorflow import * # noqa: F403, F401 + from keras.src.backend.tensorflow import ( # noqa: F403, F401 + convert_to_numpy, + ) + from keras.src.backend.tensorflow.core import * # noqa: F403, F401 + from keras.src.backend.tensorflow.math import * # noqa: F403, F401 + from keras.src.backend.tensorflow.nn import * # noqa: F403, F401 + from keras.src.backend.tensorflow.numpy import * # noqa: F403, F401 +else: + # isort: off + from keras_core.src.backend.tensorflow import * # noqa: F403, F401 + from keras_core.src.backend.tensorflow import ( # noqa: F403, F401 + convert_to_numpy, + ) + from keras_core.src.backend.tensorflow.core import * # noqa: F403, F401 + from keras_core.src.backend.tensorflow.math import * # noqa: F403, F401 + from keras_core.src.backend.tensorflow.nn import * # noqa: F403, F401 + from keras_core.src.backend.tensorflow.numpy import * # noqa: F403, F401, E501 # Some TF APIs where the numpy API doesn't support raggeds that we need from tensorflow import broadcast_to # noqa: F403, F401 +from tensorflow import concat as concatenate # noqa: F403, F401 from tensorflow import repeat # noqa: F403, F401 from tensorflow import reshape # noqa: F403, F401 -from tensorflow import split # noqa: F403, F401 -from tensorflow import concat as concatenate # noqa: F403, F401 + from tensorflow import range as arange # noqa: F403, F401 from tensorflow import reduce_all as all # noqa: F403, F401 from tensorflow import reduce_max as max # noqa: F403, F401 +from tensorflow import split # noqa: F403, F401 from tensorflow.keras.preprocessing.image import ( # noqa: F403, F401 smart_resize, ) diff --git a/keras_cv/layers/preprocessing_3d/base_augmentation_layer_3d.py b/keras_cv/layers/preprocessing_3d/base_augmentation_layer_3d.py index 93de9ec43b..20efedd972 100644 --- a/keras_cv/layers/preprocessing_3d/base_augmentation_layer_3d.py +++ b/keras_cv/layers/preprocessing_3d/base_augmentation_layer_3d.py @@ -15,9 +15,9 @@ import tensorflow as tf from keras_cv.api_export import keras_cv_export -from keras_cv.backend.config import detect_if_tensorflow_uses_keras_3 +from keras_cv.backend import config -if detect_if_tensorflow_uses_keras_3(): +if config.keras_3(): base_layer = tf.keras.layers.Layer else: base_layer = tf.keras.__internal__.layers.BaseRandomLayer @@ -106,7 +106,7 @@ def augment_pointclouds(self, point_clouds, transformation): def __init__(self, seed=None, **kwargs): # To-do: remove this once th elayer is ported to keras 3 # https://github.com/keras-team/keras-cv/issues/2136 - if detect_if_tensorflow_uses_keras_3(): + if config.keras_3(): raise ValueError( "This layer is not yet compatible with Keras 3." "Please switch to Keras 2 to use this layer." diff --git a/keras_cv/layers/regularization/dropblock_2d.py b/keras_cv/layers/regularization/dropblock_2d.py index 25b5bd6206..abef5b17d1 100644 --- a/keras_cv/layers/regularization/dropblock_2d.py +++ b/keras_cv/layers/regularization/dropblock_2d.py @@ -14,9 +14,9 @@ import tensorflow as tf -from keras_cv.backend.config import detect_if_tensorflow_uses_keras_3 +from keras_cv.backend import config -if detect_if_tensorflow_uses_keras_3(): +if config.keras_3(): base_layer = tf.keras.layers.Layer else: from tensorflow.keras.__internal__.layers import BaseRandomLayer @@ -155,7 +155,7 @@ def __init__( ): # To-do: remove this once th elayer is ported to keras 3 # https://github.com/keras-team/keras-cv/issues/2136 - if detect_if_tensorflow_uses_keras_3(): + if config.keras_3(): raise ValueError( "This layer is not yet compatible with Keras 3." "Please switch to Keras 2 to use this layer." diff --git a/keras_cv/models/object_detection/retinanet/retinanet_test.py b/keras_cv/models/object_detection/retinanet/retinanet_test.py index b2ef4f093b..bbede75943 100644 --- a/keras_cv/models/object_detection/retinanet/retinanet_test.py +++ b/keras_cv/models/object_detection/retinanet/retinanet_test.py @@ -20,7 +20,7 @@ from absl.testing import parameterized import keras_cv -from keras_cv import backend +from keras_cv.backend import config from keras_cv.backend import keras from keras_cv.backend import ops from keras_cv.models.backbones.test_backbone_presets import ( @@ -251,10 +251,7 @@ def test_call_with_custom_label_encoder(self): model(ops.ones(shape=(2, 224, 224, 3))) def test_tf_dataset_data_generator(self): - if ( - backend.config.multi_backend() - and keras.backend.backend() != "tensorflow" - ): + if config.backend() != "tensorflow": pytest.skip("TensorFlow required for `tf.data.Dataset` test.") def data_generator(): From e7df7a90b7cc4c5f05419253f7b5bb1a5e69614b Mon Sep 17 00:00:00 2001 From: divyashreepathihalli Date: Thu, 9 Nov 2023 18:06:39 +0000 Subject: [PATCH 54/54] code reformat --- keras_cv/backend/ops.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/keras_cv/backend/ops.py b/keras_cv/backend/ops.py index a53021f9ba..cdb116bf63 100644 --- a/keras_cv/backend/ops.py +++ b/keras_cv/backend/ops.py @@ -11,7 +11,8 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -from keras_cv.backend.config import keras_3, multi_backend +from keras_cv.backend.config import keras_3 +from keras_cv.backend.config import multi_backend if keras_3(): from keras.ops import * # noqa: F403, F401 @@ -24,8 +25,8 @@ except ImportError: from keras_core.src.backend import vectorized_map # noqa: F403, F401 from keras_core.src.ops import * # noqa: F403, F401 - from keras_core.src.utils.image_utils import ( + from keras_core.src.utils.image_utils import ( # noqa: F403, F401 smart_resize, - ) # noqa: F403, F401 + ) if not multi_backend(): from keras_cv.backend.tf_ops import * # noqa: F403, F401