From 8f5950a9689654f53f3ed61b43a0e2eb69561585 Mon Sep 17 00:00:00 2001 From: Github Actions Bot Date: Wed, 27 Sep 2023 03:11:30 +0000 Subject: [PATCH 01/13] [nightly] Increase version to 0.18.0.dev12 --- tensorflow_similarity/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_similarity/__init__.py b/tensorflow_similarity/__init__.py index 00ae9883..70da91b1 100644 --- a/tensorflow_similarity/__init__.py +++ b/tensorflow_similarity/__init__.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. -__version__ = "0.18.0.dev11" +__version__ = "0.18.0.dev12" from . import models # noqa From 5a1f25baaa68869898938b22b23fd8d1f75dd712 Mon Sep 17 00:00:00 2001 From: Owen Vallis Date: Sun, 22 Oct 2023 18:16:30 +0000 Subject: [PATCH 02/13] Change import to use TF keras legacy utils to access serialize and deserialize. --- tensorflow_similarity/augmenters/__init__.py | 13 +++++++++++++ tensorflow_similarity/distances/__init__.py | 2 +- tensorflow_similarity/search/__init__.py | 2 +- tensorflow_similarity/stores/__init__.py | 2 +- 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/tensorflow_similarity/augmenters/__init__.py b/tensorflow_similarity/augmenters/__init__.py index 7f9b3edc..3c260457 100644 --- a/tensorflow_similarity/augmenters/__init__.py +++ b/tensorflow_similarity/augmenters/__init__.py @@ -1,3 +1,16 @@ +# Copyright 2021 The TensorFlow 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 +# +# http://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 .augmenter import Augmenter # noqa from .barlow import BarlowAugmenter # noqa from .contrastive import ContrastiveAugmenter # noqa diff --git a/tensorflow_similarity/distances/__init__.py b/tensorflow_similarity/distances/__init__.py index ab505443..70b9912e 100644 --- a/tensorflow_similarity/distances/__init__.py +++ b/tensorflow_similarity/distances/__init__.py @@ -16,7 +16,7 @@ from typing import Any, Type -from tensorflow.python.keras.utils.generic_utils import ( +from tensorflow.keras.utils.legacy import ( deserialize_keras_object, serialize_keras_object, ) diff --git a/tensorflow_similarity/search/__init__.py b/tensorflow_similarity/search/__init__.py index c610d1f7..eb51a8ec 100644 --- a/tensorflow_similarity/search/__init__.py +++ b/tensorflow_similarity/search/__init__.py @@ -36,7 +36,7 @@ from typing import Any, Type -from tensorflow.python.keras.utils.generic_utils import ( +from tensorflow.keras.utils.legacy import ( deserialize_keras_object, serialize_keras_object, ) diff --git a/tensorflow_similarity/stores/__init__.py b/tensorflow_similarity/stores/__init__.py index 3d0182b6..f7bb3bef 100644 --- a/tensorflow_similarity/stores/__init__.py +++ b/tensorflow_similarity/stores/__init__.py @@ -30,7 +30,7 @@ from typing import Any, Type -from tensorflow.python.keras.utils.generic_utils import ( +from tensorflow.keras.utils.legacy import ( deserialize_keras_object, serialize_keras_object, ) From a441c9c05c3840d8e60bb635f542c0fb3fd0873f Mon Sep 17 00:00:00 2001 From: Owen Vallis Date: Mon, 23 Oct 2023 03:19:56 +0000 Subject: [PATCH 03/13] Add try/except to handle updated import path in tf 2.13 --- tensorflow_similarity/distances/__init__.py | 11 +++++++---- tensorflow_similarity/search/__init__.py | 11 +++++++---- tensorflow_similarity/stores/__init__.py | 11 +++++++---- 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/tensorflow_similarity/distances/__init__.py b/tensorflow_similarity/distances/__init__.py index 70b9912e..e2fb7925 100644 --- a/tensorflow_similarity/distances/__init__.py +++ b/tensorflow_similarity/distances/__init__.py @@ -16,10 +16,13 @@ from typing import Any, Type -from tensorflow.keras.utils.legacy import ( - deserialize_keras_object, - serialize_keras_object, -) +try: + from tensorflow.keras.utils import deserialize_keras_object, serialize_keras_object +except ImportError: + from tensorflow.keras.utils.legacy import ( + deserialize_keras_object, + serialize_keras_object, + ) from .cosine import CosineDistance # noqa from .distance import Distance # noqa diff --git a/tensorflow_similarity/search/__init__.py b/tensorflow_similarity/search/__init__.py index eb51a8ec..4447e485 100644 --- a/tensorflow_similarity/search/__init__.py +++ b/tensorflow_similarity/search/__init__.py @@ -36,10 +36,13 @@ from typing import Any, Type -from tensorflow.keras.utils.legacy import ( - deserialize_keras_object, - serialize_keras_object, -) +try: + from tensorflow.keras.utils import deserialize_keras_object, serialize_keras_object +except ImportError: + from tensorflow.keras.utils.legacy import ( + deserialize_keras_object, + serialize_keras_object, + ) from .faiss import FaissSearch # noqa from .linear import LinearSearch # noqa diff --git a/tensorflow_similarity/stores/__init__.py b/tensorflow_similarity/stores/__init__.py index f7bb3bef..12c1f4aa 100644 --- a/tensorflow_similarity/stores/__init__.py +++ b/tensorflow_similarity/stores/__init__.py @@ -30,10 +30,13 @@ from typing import Any, Type -from tensorflow.keras.utils.legacy import ( - deserialize_keras_object, - serialize_keras_object, -) +try: + from tensorflow.keras.utils import deserialize_keras_object, serialize_keras_object +except ImportError: + from tensorflow.keras.utils.legacy import ( + deserialize_keras_object, + serialize_keras_object, + ) from .cached import CachedStore # noqa from .memory import MemoryStore # noqa From 940ecc4b6afb36f1fa76804270bd7a17a32604dd Mon Sep 17 00:00:00 2001 From: Owen Vallis Date: Mon, 23 Oct 2023 04:59:13 +0000 Subject: [PATCH 04/13] Add from_config to abstract classes to support deserialization. --- tensorflow_similarity/distances/distance.py | 17 +++++++++++++++++ tensorflow_similarity/search/search.py | 17 +++++++++++++++++ tensorflow_similarity/stores/store.py | 17 +++++++++++++++++ 3 files changed, 51 insertions(+) diff --git a/tensorflow_similarity/distances/distance.py b/tensorflow_similarity/distances/distance.py index ed8bcc87..ff318a6a 100644 --- a/tensorflow_similarity/distances/distance.py +++ b/tensorflow_similarity/distances/distance.py @@ -54,3 +54,20 @@ def get_config(self) -> dict[str, Any]: config = {"name": self.name} return config + + @classmethod + def from_config(cls, config: dict[str, Any]) -> Distance: + """Build a distance from a config. + + Args: + config: A Python dict containing the configuration of the distance. + + Returns: + A distance instance. + """ + try: + return cls(**config) + except Exception as e: + raise TypeError( + f"Error when deserializing '{cls.__name__}' using" f"config={config}.\n\nException encountered: {e}" + ) diff --git a/tensorflow_similarity/search/search.py b/tensorflow_similarity/search/search.py index eb9f42eb..c29d34f0 100644 --- a/tensorflow_similarity/search/search.py +++ b/tensorflow_similarity/search/search.py @@ -135,3 +135,20 @@ def get_config(self) -> dict[str, Any]: def is_built(self): "Returns whether or not the index is built and ready for querying." "" return self.built + + @classmethod + def from_config(cls, config: dict[str, Any]) -> Distance: + """Build a store from a config. + + Args: + config: A Python dict containing the configuration of the store. + + Returns: + A distance instance. + """ + try: + return cls(**config) + except Exception as e: + raise TypeError( + f"Error when deserializing '{cls.__name__}' using" f"config={config}.\n\nException encountered: {e}" + ) diff --git a/tensorflow_similarity/stores/store.py b/tensorflow_similarity/stores/store.py index ca0673dc..b3d61de1 100644 --- a/tensorflow_similarity/stores/store.py +++ b/tensorflow_similarity/stores/store.py @@ -151,3 +151,20 @@ def get_config(self) -> dict[str, Any]: } return config + + @classmethod + def from_config(cls, config: dict[str, Any]) -> Distance: + """Build a store from a config. + + Args: + config: A Python dict containing the configuration of the store. + + Returns: + A distance instance. + """ + try: + return cls(**config) + except Exception as e: + raise TypeError( + f"Error when deserializing '{cls.__name__}' using" f"config={config}.\n\nException encountered: {e}" + ) From 61b834a86cd684071d27b5614eb017249420ba03 Mon Sep 17 00:00:00 2001 From: Owen Vallis Date: Mon, 23 Oct 2023 17:25:11 +0000 Subject: [PATCH 05/13] Fix typing on from_config for search and store --- tensorflow_similarity/search/search.py | 6 +++--- tensorflow_similarity/stores/store.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tensorflow_similarity/search/search.py b/tensorflow_similarity/search/search.py index c29d34f0..45b6ea3d 100644 --- a/tensorflow_similarity/search/search.py +++ b/tensorflow_similarity/search/search.py @@ -137,11 +137,11 @@ def is_built(self): return self.built @classmethod - def from_config(cls, config: dict[str, Any]) -> Distance: - """Build a store from a config. + def from_config(cls, config: dict[str, Any]) -> Search: + """Build a search from a config. Args: - config: A Python dict containing the configuration of the store. + config: A Python dict containing the configuration of the search. Returns: A distance instance. diff --git a/tensorflow_similarity/stores/store.py b/tensorflow_similarity/stores/store.py index b3d61de1..83fe8197 100644 --- a/tensorflow_similarity/stores/store.py +++ b/tensorflow_similarity/stores/store.py @@ -153,7 +153,7 @@ def get_config(self) -> dict[str, Any]: return config @classmethod - def from_config(cls, config: dict[str, Any]) -> Distance: + def from_config(cls, config: dict[str, Any]) -> Store: """Build a store from a config. Args: From efea7389b7d29649d12f7c3ad031cfd012cedbc7 Mon Sep 17 00:00:00 2001 From: Github Actions Bot Date: Tue, 24 Oct 2023 03:12:13 +0000 Subject: [PATCH 06/13] [nightly] Increase version to 0.18.0.dev13 --- tensorflow_similarity/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_similarity/__init__.py b/tensorflow_similarity/__init__.py index 70da91b1..37bc95e3 100644 --- a/tensorflow_similarity/__init__.py +++ b/tensorflow_similarity/__init__.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. -__version__ = "0.18.0.dev12" +__version__ = "0.18.0.dev13" from . import models # noqa From 4a36c23ea0be03e0bc0d6d0ec2cdda633af9c82b Mon Sep 17 00:00:00 2001 From: Owen Vallis Date: Wed, 14 Feb 2024 06:10:14 +0000 Subject: [PATCH 07/13] Update max TF Version in setup and workflow tests. --- .github/workflows/nightly-publish.yml | 3 --- .github/workflows/test.yml | 4 ++-- setup.py | 6 +++--- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/.github/workflows/nightly-publish.yml b/.github/workflows/nightly-publish.yml index a3655271..e8cd8081 100644 --- a/.github/workflows/nightly-publish.yml +++ b/.github/workflows/nightly-publish.yml @@ -2,9 +2,6 @@ name: NightlyPublish on: workflow_dispatch: # Allow manual triggers - schedule: - # Runs every day at 3:07am UTC. - - cron: '7 3 * * *' jobs: check: diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 8dbd8bd5..be377f69 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -17,11 +17,11 @@ jobs: - python-version: '3.7' tf-version: '2.8' - python-version: '3.7' - tf-version: '2.11' + tf-version: '2.15' - python-version: '3.10' tf-version: '2.8' - python-version: '3.10' - tf-version: '2.11' + tf-version: '2.15' steps: - uses: actions/checkout@v2 diff --git a/setup.py b/setup.py index 0350018e..536e84e9 100644 --- a/setup.py +++ b/setup.py @@ -88,9 +88,9 @@ def get_version(rel_path): "redis": ["redis"], "faiss": ["faiss-gpu"], "nmslib": ["nmslib"], - "tensorflow": ["tensorflow>=2.7,<=2.11"], - "tensorflow-gpu": ["tensorflow-gpu>=2.7,<=2.11"], - "tensorflow-cpu": ["tensorflow-cpu>=2.7,<=2.11"], + "tensorflow": ["tensorflow>=2.8,<=2.15"], + "tensorflow-gpu": ["tensorflow-gpu>=2.8,<=2.15"], + "tensorflow-cpu": ["tensorflow-cpu>=2.8,<=2.15"], }, classifiers=[ "Development Status :: 5 - Production/Stable", From 6e0e80344139bc3e5bac98e3b0cc6d950fd54d26 Mon Sep 17 00:00:00 2001 From: Owen Vallis Date: Wed, 14 Feb 2024 06:24:27 +0000 Subject: [PATCH 08/13] Update pip install for TF in github workflow tests --- .github/workflows/test.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index be377f69..abc8f5a4 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -17,11 +17,11 @@ jobs: - python-version: '3.7' tf-version: '2.8' - python-version: '3.7' - tf-version: '2.15' + tf-version: '2.15.0.post1' - python-version: '3.10' tf-version: '2.8' - python-version: '3.10' - tf-version: '2.15' + tf-version: '2.15.0.post1' steps: - uses: actions/checkout@v2 @@ -36,7 +36,7 @@ jobs: - name: Install TF package run: | - pip install tensorflow==${{ matrix.tf-version }} + pip install tensorflow[and-cuda]==${{ matrix.tf-version }} # Fix proto dep issue in protobuf 4 pip install protobuf==3.20.* From d36d6be6a257ef4cd3ae44faf61ead0c849bb1a2 Mon Sep 17 00:00:00 2001 From: Owen Vallis Date: Wed, 14 Feb 2024 06:27:08 +0000 Subject: [PATCH 09/13] Set TF to 2.11 for py 3.7 tests in workflows. --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index abc8f5a4..cc59694c 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -17,7 +17,7 @@ jobs: - python-version: '3.7' tf-version: '2.8' - python-version: '3.7' - tf-version: '2.15.0.post1' + tf-version: '2.11' - python-version: '3.10' tf-version: '2.8' - python-version: '3.10' From 3fb19acf3305c6118c5244eb6559d4e1e2061807 Mon Sep 17 00:00:00 2001 From: Owen Vallis Date: Mon, 6 May 2024 02:09:56 +0000 Subject: [PATCH 10/13] Fix testing errors cause by recent TF updates. - Remove exact check for metric_embedding config dict. This class is a thin wrapper around the layers.Dense class and doesn't take any custom args. - Update the deserialize from identifier functions to raise the ValueError if we are not able to cover the identifier to the target object type. --- tensorflow_similarity/distances/__init__.py | 11 +++++----- tensorflow_similarity/search/__init__.py | 11 +++++----- tensorflow_similarity/stores/__init__.py | 11 +++++----- tests/test_layers.py | 24 +-------------------- 4 files changed, 19 insertions(+), 38 deletions(-) diff --git a/tensorflow_similarity/distances/__init__.py b/tensorflow_similarity/distances/__init__.py index e2fb7925..e3fda865 100644 --- a/tensorflow_similarity/distances/__init__.py +++ b/tensorflow_similarity/distances/__init__.py @@ -110,12 +110,13 @@ def get(identifier) -> Distance: Raises: ValueError: If `identifier` cannot be interpreted. """ - if isinstance(identifier, Distance): - return identifier - elif isinstance(identifier, dict): - return deserialize(identifier) + if isinstance(identifier, dict): + identifier = deserialize(identifier) elif isinstance(identifier, str): config = {"class_name": str(identifier), "config": {}} - return deserialize(config) + identifier = deserialize(config) + + if isinstance(identifier, Distance): + return identifier else: raise ValueError("Could not interpret search identifier: {}".format(identifier)) diff --git a/tensorflow_similarity/search/__init__.py b/tensorflow_similarity/search/__init__.py index 4447e485..9fd56ef9 100644 --- a/tensorflow_similarity/search/__init__.py +++ b/tensorflow_similarity/search/__init__.py @@ -117,12 +117,13 @@ def get(identifier, **kwargs) -> Search: Raises: ValueError: If `identifier` cannot be interpreted. """ - if isinstance(identifier, Search): - return identifier - elif isinstance(identifier, dict): - return deserialize(identifier) + if isinstance(identifier, dict): + identifier = deserialize(identifier) elif isinstance(identifier, str): config = {"class_name": str(identifier), "config": kwargs} - return deserialize(config) + identifier = deserialize(config) + + if isinstance(identifier, Search): + return identifier else: raise ValueError("Could not interpret search identifier: {}".format(identifier)) diff --git a/tensorflow_similarity/stores/__init__.py b/tensorflow_similarity/stores/__init__.py index 12c1f4aa..5cf54826 100644 --- a/tensorflow_similarity/stores/__init__.py +++ b/tensorflow_similarity/stores/__init__.py @@ -109,12 +109,13 @@ def get(identifier) -> Store: Raises: ValueError: If `identifier` cannot be interpreted. """ - if isinstance(identifier, Store): - return identifier - elif isinstance(identifier, dict): - return deserialize(identifier) + if isinstance(identifier, dict): + identifier = deserialize(identifier) elif isinstance(identifier, str): config = {"class_name": str(identifier), "config": {}} - return deserialize(config) + identifier = deserialize(config) + + if isinstance(identifier, Store): + return identifier else: raise ValueError("Could not interpret Store identifier: {}".format(identifier)) diff --git a/tests/test_layers.py b/tests/test_layers.py index dc908f8a..7c96731f 100644 --- a/tests/test_layers.py +++ b/tests/test_layers.py @@ -1,6 +1,7 @@ import math import tensorflow as tf +from tensorflow.keras import layers from tensorflow_similarity.layers import ( GeneralizedMeanPooling1D, @@ -160,29 +161,6 @@ def test_metric_embedding(self): expected_result = tf.constant([[0.5, 0.5, 0.5, 0.5], [0.5, 0.5, 0.5, 0.5]]) self.assertAllClose(result, expected_result, rtol=1e-06) - def test_metric_embedding_get_config(self): - me_layer = MetricEmbedding(32) - config = me_layer.get_config() - expected_config = { - "name": "metric_embedding", - "trainable": True, - "dtype": "float32", - "units": 32, - "activation": "linear", - "use_bias": True, - "kernel_initializer": { - "class_name": "GlorotUniform", - "config": {"seed": None}, - }, - "bias_initializer": {"class_name": "Zeros", "config": {}}, - "kernel_regularizer": None, - "bias_regularizer": None, - "activity_regularizer": None, - "kernel_constraint": None, - "bias_constraint": None, - } - self.assertEqual(expected_config, config) - if __name__ == "__main__": tf.test.main() From f0d05fa01413797926bff665a1073343d947ac1d Mon Sep 17 00:00:00 2001 From: Owen Vallis Date: Mon, 6 May 2024 02:23:25 +0000 Subject: [PATCH 11/13] Update python and TF versions in github workflow tests. --- .github/workflows/test.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index cc59694c..248f6dff 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -16,12 +16,12 @@ jobs: include: - python-version: '3.7' tf-version: '2.8' - - python-version: '3.7' - tf-version: '2.11' + - python-version: '3.9' + tf-version: '2.16.1' - python-version: '3.10' tf-version: '2.8' - - python-version: '3.10' - tf-version: '2.15.0.post1' + - python-version: '3.12' + tf-version: '2.16.1' steps: - uses: actions/checkout@v2 From ef06bbe6ff5d67c43dcbfb08502f720440543082 Mon Sep 17 00:00:00 2001 From: Owen Vallis Date: Mon, 6 May 2024 14:56:07 +0000 Subject: [PATCH 12/13] Update tests and setup to require python 3.8 or later and limit TF to 2.15 --- .github/workflows/test.yml | 8 ++++---- setup.py | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 248f6dff..559a1aa7 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -14,14 +14,14 @@ jobs: fail-fast: false matrix: include: - - python-version: '3.7' + - python-version: '3.8' tf-version: '2.8' - python-version: '3.9' - tf-version: '2.16.1' + tf-version: '2.16.0' - python-version: '3.10' tf-version: '2.8' - - python-version: '3.12' - tf-version: '2.16.1' + - python-version: '3.11' + tf-version: '2.15.0' steps: - uses: actions/checkout@v2 diff --git a/setup.py b/setup.py index 536e84e9..9ab686b6 100644 --- a/setup.py +++ b/setup.py @@ -55,6 +55,7 @@ def get_version(rel_path): author_email="tf-similarity@google.com", url="https://github.com/tensorflow/similarity", license="Apache License 2.0", + python_requires=">=3.8", install_requires=[ "numpy", "pandas", From d5e509af8be1d8e281e8d1b0693a9d64ae23209f Mon Sep 17 00:00:00 2001 From: Owen Vallis Date: Mon, 6 May 2024 14:57:42 +0000 Subject: [PATCH 13/13] Limit all tests to TF versions<=2.15 --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 559a1aa7..b5e06077 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -17,7 +17,7 @@ jobs: - python-version: '3.8' tf-version: '2.8' - python-version: '3.9' - tf-version: '2.16.0' + tf-version: '2.15.0' - python-version: '3.10' tf-version: '2.8' - python-version: '3.11'