From 318b0b04c5d5d2332313d0893b91d791e545a476 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A1bor=20Lipt=C3=A1k?= Date: Wed, 5 Jun 2024 11:59:52 -0500 Subject: [PATCH 01/18] Replace snappy with cramjam (#1091) * add downloads tile (#1085) * Replace snappy with cramjam * Delete test_no_snappy --------- Co-authored-by: Taylor Turner --- .pre-commit-config.yaml | 2 +- dataprofiler/__init__.py | 16 ---------- dataprofiler/tests/test_data_profiler.py | 40 ------------------------ requirements.txt | 2 +- 4 files changed, 2 insertions(+), 58 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 7baeb59ec..f36c52663 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -55,7 +55,7 @@ repos: pyarrow>=1.0.1, chardet>=3.0.4, fastavro>=1.0.0.post1, - python-snappy>=0.5.4, + cramjam>=2.7.0, charset-normalizer>=1.3.6, psutil>=4.0.0, scipy>=1.4.1, diff --git a/dataprofiler/__init__.py b/dataprofiler/__init__.py index 2e89d3e2b..5f218bd85 100644 --- a/dataprofiler/__init__.py +++ b/dataprofiler/__init__.py @@ -20,22 +20,6 @@ from .validators.base_validators import Validator from .version import __version__ -try: - import snappy -except ImportError: - import warnings - - warnings.warn( - "Snappy must be installed to use parquet/avro datasets." - "\n\n" - "For macOS use Homebrew:\n" - "\t`brew install snappy`" - "\n\n" - "For linux use apt-get:\n`" - "\tsudo apt-get -y install libsnappy-dev`\n", - ImportWarning, - ) - def set_seed(seed=None): # also check it's an integer diff --git a/dataprofiler/tests/test_data_profiler.py b/dataprofiler/tests/test_data_profiler.py index ef7664cea..9ebdfa039 100644 --- a/dataprofiler/tests/test_data_profiler.py +++ b/dataprofiler/tests/test_data_profiler.py @@ -56,46 +56,6 @@ def test_data_profiling(self): self.assertIsNotNone(profile.profile) self.assertIsNotNone(profile.report()) - def test_no_snappy(self): - import importlib - import sys - import types - - orig_import = __import__ - # necessary for any wrapper around the library to test if snappy caught - # as an issue - - def reload_data_profiler(): - """Recursively reload modules.""" - sys_modules = sys.modules.copy() - for module_name, module in sys_modules.items(): - # Only reload top level of the dataprofiler - if "dataprofiler" in module_name and len(module_name.split(".")) < 3: - if isinstance(module, types.ModuleType): - importlib.reload(module) - - def import_mock(name, *args, **kwargs): - if name == "snappy": - raise ImportError("test") - return orig_import(name, *args, **kwargs) - - with mock.patch("builtins.__import__", side_effect=import_mock): - with self.assertWarns(ImportWarning) as w: - import dataprofiler - - reload_data_profiler() - - self.assertEqual( - str(w.warning), - "Snappy must be installed to use parquet/avro datasets." - "\n\n" - "For macOS use Homebrew:\n" - "\t`brew install snappy`" - "\n\n" - "For linux use apt-get:\n`" - "\tsudo apt-get -y install libsnappy-dev`\n", - ) - def test_no_tensorflow(self): import sys diff --git a/requirements.txt b/requirements.txt index a45dc34ae..405f808b3 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,7 +7,7 @@ pytz>=2020.1 pyarrow>=1.0.1 chardet>=3.0.4 fastavro>=1.0.0.post1 -python-snappy>=0.5.4 +cramjam>=2.7.0 charset-normalizer>=1.3.6 psutil>=4.0.0 scipy>=1.10.0 From af9f275716113fa7d6a1e9b75be77ea5438a558d Mon Sep 17 00:00:00 2001 From: Taylor Turner Date: Wed, 5 Jun 2024 11:59:52 -0500 Subject: [PATCH 02/18] pre-commit fix (#1122) --- .pre-commit-config.yaml | 2 +- dataprofiler/__init__.py | 16 ++++++++++ dataprofiler/tests/test_data_profiler.py | 40 ++++++++++++++++++++++++ requirements.txt | 2 +- 4 files changed, 58 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f36c52663..7baeb59ec 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -55,7 +55,7 @@ repos: pyarrow>=1.0.1, chardet>=3.0.4, fastavro>=1.0.0.post1, - cramjam>=2.7.0, + python-snappy>=0.5.4, charset-normalizer>=1.3.6, psutil>=4.0.0, scipy>=1.4.1, diff --git a/dataprofiler/__init__.py b/dataprofiler/__init__.py index 5f218bd85..2e89d3e2b 100644 --- a/dataprofiler/__init__.py +++ b/dataprofiler/__init__.py @@ -20,6 +20,22 @@ from .validators.base_validators import Validator from .version import __version__ +try: + import snappy +except ImportError: + import warnings + + warnings.warn( + "Snappy must be installed to use parquet/avro datasets." + "\n\n" + "For macOS use Homebrew:\n" + "\t`brew install snappy`" + "\n\n" + "For linux use apt-get:\n`" + "\tsudo apt-get -y install libsnappy-dev`\n", + ImportWarning, + ) + def set_seed(seed=None): # also check it's an integer diff --git a/dataprofiler/tests/test_data_profiler.py b/dataprofiler/tests/test_data_profiler.py index 9ebdfa039..ef7664cea 100644 --- a/dataprofiler/tests/test_data_profiler.py +++ b/dataprofiler/tests/test_data_profiler.py @@ -56,6 +56,46 @@ def test_data_profiling(self): self.assertIsNotNone(profile.profile) self.assertIsNotNone(profile.report()) + def test_no_snappy(self): + import importlib + import sys + import types + + orig_import = __import__ + # necessary for any wrapper around the library to test if snappy caught + # as an issue + + def reload_data_profiler(): + """Recursively reload modules.""" + sys_modules = sys.modules.copy() + for module_name, module in sys_modules.items(): + # Only reload top level of the dataprofiler + if "dataprofiler" in module_name and len(module_name.split(".")) < 3: + if isinstance(module, types.ModuleType): + importlib.reload(module) + + def import_mock(name, *args, **kwargs): + if name == "snappy": + raise ImportError("test") + return orig_import(name, *args, **kwargs) + + with mock.patch("builtins.__import__", side_effect=import_mock): + with self.assertWarns(ImportWarning) as w: + import dataprofiler + + reload_data_profiler() + + self.assertEqual( + str(w.warning), + "Snappy must be installed to use parquet/avro datasets." + "\n\n" + "For macOS use Homebrew:\n" + "\t`brew install snappy`" + "\n\n" + "For linux use apt-get:\n`" + "\tsudo apt-get -y install libsnappy-dev`\n", + ) + def test_no_tensorflow(self): import sys diff --git a/requirements.txt b/requirements.txt index 405f808b3..a45dc34ae 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,7 +7,7 @@ pytz>=2020.1 pyarrow>=1.0.1 chardet>=3.0.4 fastavro>=1.0.0.post1 -cramjam>=2.7.0 +python-snappy>=0.5.4 charset-normalizer>=1.3.6 psutil>=4.0.0 scipy>=1.10.0 From 4491b9736e59addf675928015448eb2b34035256 Mon Sep 17 00:00:00 2001 From: James Schadt Date: Wed, 5 Jun 2024 12:00:11 -0500 Subject: [PATCH 03/18] Bug fix for float precision calculation using categorical data with trailing zeros. (#1125) --- dataprofiler/profilers/float_column_profile.py | 5 ++++- dataprofiler/tests/profilers/test_float_column_profile.py | 7 +++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/dataprofiler/profilers/float_column_profile.py b/dataprofiler/profilers/float_column_profile.py index bc426a447..29417584e 100644 --- a/dataprofiler/profilers/float_column_profile.py +++ b/dataprofiler/profilers/float_column_profile.py @@ -305,7 +305,10 @@ def _get_float_precision( # length of sampled cells after all punctuation removed len_per_float = ( - df_series_clean.sample(sample_size).replace(to_replace=r, value="").map(len) + df_series_clean.sample(sample_size) + .astype(object) + .replace(to_replace=r, value="") + .map(len) ).astype(float) # Determine statistics precision diff --git a/dataprofiler/tests/profilers/test_float_column_profile.py b/dataprofiler/tests/profilers/test_float_column_profile.py index d79fdd641..06441dcb7 100644 --- a/dataprofiler/tests/profilers/test_float_column_profile.py +++ b/dataprofiler/tests/profilers/test_float_column_profile.py @@ -211,6 +211,13 @@ def test_profiled_precision(self): msg=f"Errored for: {sample[0]}", ) + # Validate categorical series with trailing zeros supported + categorical_series = pd.Series( + [202209, 202210, 202211], dtype="category" + ).apply(str) + float_profiler = FloatColumn("Name") + float_profiler.update(categorical_series) + def test_profiled_min(self): # test with multiple values data = np.linspace(-5, 5, 11) From 70c8d85cbdf97354a4a78da3c842a984bd305830 Mon Sep 17 00:00:00 2001 From: Taylor Turner Date: Wed, 5 Jun 2024 12:00:11 -0500 Subject: [PATCH 04/18] =?UTF-8?q?Revert=20"Bug=20fix=20for=20float=20preci?= =?UTF-8?q?sion=20calculation=20using=20categorical=20data=20with=20t?= =?UTF-8?q?=E2=80=A6"=20(#1133)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit d3159bd13911892e74c264966fba011d50f20e95. --- dataprofiler/profilers/float_column_profile.py | 5 +---- dataprofiler/tests/profilers/test_float_column_profile.py | 7 ------- 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/dataprofiler/profilers/float_column_profile.py b/dataprofiler/profilers/float_column_profile.py index 29417584e..bc426a447 100644 --- a/dataprofiler/profilers/float_column_profile.py +++ b/dataprofiler/profilers/float_column_profile.py @@ -305,10 +305,7 @@ def _get_float_precision( # length of sampled cells after all punctuation removed len_per_float = ( - df_series_clean.sample(sample_size) - .astype(object) - .replace(to_replace=r, value="") - .map(len) + df_series_clean.sample(sample_size).replace(to_replace=r, value="").map(len) ).astype(float) # Determine statistics precision diff --git a/dataprofiler/tests/profilers/test_float_column_profile.py b/dataprofiler/tests/profilers/test_float_column_profile.py index 06441dcb7..d79fdd641 100644 --- a/dataprofiler/tests/profilers/test_float_column_profile.py +++ b/dataprofiler/tests/profilers/test_float_column_profile.py @@ -211,13 +211,6 @@ def test_profiled_precision(self): msg=f"Errored for: {sample[0]}", ) - # Validate categorical series with trailing zeros supported - categorical_series = pd.Series( - [202209, 202210, 202211], dtype="category" - ).apply(str) - float_profiler = FloatColumn("Name") - float_profiler.update(categorical_series) - def test_profiled_min(self): # test with multiple values data = np.linspace(-5, 5, 11) From 25861c88d6bd0254e604a2d68b49350508a952c5 Mon Sep 17 00:00:00 2001 From: Jeremy Goodsitt Date: Wed, 5 Jun 2024 12:00:11 -0500 Subject: [PATCH 05/18] refactor: move layers outside of class --- .../labelers/character_level_cnn_model.py | 197 ++++++++++-------- 1 file changed, 115 insertions(+), 82 deletions(-) diff --git a/dataprofiler/labelers/character_level_cnn_model.py b/dataprofiler/labelers/character_level_cnn_model.py index 3194a2616..2751dc2da 100644 --- a/dataprofiler/labelers/character_level_cnn_model.py +++ b/dataprofiler/labelers/character_level_cnn_model.py @@ -74,6 +74,112 @@ def create_glove_char(n_dims: int, source_file: str = None) -> None: file.write(word + " " + " ".join(str(num) for num in embd) + "\n") +@tf.keras.utils.register_keras_serializable(package="CharacterLevelCnnModel") +class ThreshArgMaxLayer(tf.keras.layers.Layer): + def __init__( + self, threshold_: float, num_labels_: int, default_ind: int = 1, *args, **kwargs + ) -> None: + super().__init__(*args, **kwargs) + self._threshold_ = threshold_ + self._num_labels_ = num_labels_ + self._default_ind = default_ind + thresh_init = tf.constant_initializer(threshold_) + self.thresh_vec = tf.Variable( + name="ThreshVec", + initial_value=thresh_init(shape=[num_labels_]), + trainable=False, + ) + + def get_config(self): + config = super().get_config().copy() + config.update( + { + "threshold_": self._threshold_, + "num_labels_": self._num_labels_, + "default_ind": self._default_ind, + } + ) + return config + + def call(self, argmax_layer: tf.Tensor, confidence_layer: tf.Tensor) -> tf.Tensor: + threshold_at_argmax = tf.gather(self.thresh_vec, argmax_layer) + + confidence_max_layer = tf.keras.backend.max(confidence_layer, axis=2) + + # Check if the confidences meet the threshold minimum. + argmax_mask = tf.keras.backend.cast( + tf.keras.backend.greater_equal(confidence_max_layer, threshold_at_argmax), + dtype=argmax_layer.dtype, + ) + + # Create a vector the same size as the batch_size which + # represents the background label + bg_label_tf = tf.keras.backend.constant( + self._default_ind, dtype=argmax_layer.dtype + ) + + # Generate the final predicted output using the function: + final_predicted_layer = tf.add( + bg_label_tf, + tf.multiply(tf.subtract(argmax_layer, bg_label_tf), argmax_mask), + name="ThreshArgMax", + ) + # final_predicted_layer.set_shape(argmax_layer.shape) + return final_predicted_layer + + +@tf.keras.utils.register_keras_serializable(package="CharacterLevelCnnModel") +class EncodingLayer(tf.keras.layers.Layer): + def __init__( + self, max_char_encoding_id: int, max_len: int, *args, **kwargs + ) -> None: + """ + Encode characters for the list of sentences. + + :param max_char_encoding_id: Maximum integer value for encoding the + input + :type max_char_encoding_id: int + :param max_len: Maximum char length in a sample + :type max_len: int + """ + super().__init__(*args, **kwargs) + self.max_char_encoding_id = max_char_encoding_id + self.max_len = max_len + + def get_config(self): + config = super().get_config().copy() + config.update( + { + "max_char_encoding_id": self.max_char_encoding_id, + "max_len": self.max_len, + } + ) + return config + + def call(self, input_str_tensor: tf.Tensor) -> tf.Tensor: + """ + Encode characters for the list of sentences. + + :param input_str_tensor: input list of sentences converted to tensor + :type input_str_tensor: tf.tensor + :return : tensor containing encoded list of input sentences + :rtype: tf.Tensor + """ + # convert characters to indices + input_str_flatten = tf.reshape(input_str_tensor, [-1]) + sentences_encode = tf.strings.unicode_decode( + input_str_flatten, input_encoding="UTF-8" + ) + sentences_encode = tf.add(tf.cast(1, tf.int32), sentences_encode) + sentences_encode = tf.math.minimum( + sentences_encode, self.max_char_encoding_id + 1 + ) + + # padding + sentences_encode_pad = sentences_encode.to_tensor(shape=[None, self.max_len]) + return sentences_encode_pad + + class CharacterLevelCnnModel(BaseTrainableModel, metaclass=AutoSubRegistrationMeta): """Class for training char data labeler.""" @@ -333,35 +439,6 @@ def load_from_disk(cls, dirpath: str) -> CharacterLevelCnnModel: ] return loaded_model - @staticmethod - def _char_encoding_layer( - input_str_tensor: tf.Tensor, max_char_encoding_id: int, max_len: int - ) -> tf.Tensor: - """ - Encode characters for the list of sentences. - - :param input_str_tensor: input list of sentences converted to tensor - :type input_str_tensor: tf.tensor - :param max_char_encoding_id: Maximum integer value for encoding the - input - :type max_char_encoding_id: int - :param max_len: Maximum char length in a sample - :type max_len: int - :return : tensor containing encoded list of input sentences - :rtype: tf.Tensor - """ - # convert characters to indices - input_str_flatten = tf.reshape(input_str_tensor, [-1]) - sentences_encode = tf.strings.unicode_decode( - input_str_flatten, input_encoding="UTF-8" - ) - sentences_encode = tf.add(tf.cast(1, tf.int32), sentences_encode) - sentences_encode = tf.math.minimum(sentences_encode, max_char_encoding_id + 1) - - # padding - sentences_encode_pad = sentences_encode.to_tensor(shape=[None, max_len]) - return sentences_encode_pad - @staticmethod def _argmax_threshold_layer( num_labels: int, threshold: float = 0.0, default_ind: int = 1 @@ -383,47 +460,7 @@ def _argmax_threshold_layer( """ # Initialize the thresholds vector variable and create the threshold # matrix. - class ThreshArgMaxLayer(tf.keras.layers.Layer): - def __init__(self, threshold_: float, num_labels_: int) -> None: - super().__init__() - thresh_init = tf.constant_initializer(threshold_) - self.thresh_vec = tf.Variable( - name="ThreshVec", - initial_value=thresh_init(shape=[num_labels_]), - trainable=False, - ) - - def call( - self, argmax_layer: tf.Tensor, confidence_layer: tf.Tensor - ) -> tf.Tensor: - threshold_at_argmax = tf.gather(self.thresh_vec, argmax_layer) - - confidence_max_layer = tf.keras.backend.max(confidence_layer, axis=2) - - # Check if the confidences meet the threshold minimum. - argmax_mask = tf.keras.backend.cast( - tf.keras.backend.greater_equal( - confidence_max_layer, threshold_at_argmax - ), - dtype=argmax_layer.dtype, - ) - - # Create a vector the same size as the batch_size which - # represents the background label - bg_label_tf = tf.keras.backend.constant( - default_ind, dtype=argmax_layer.dtype - ) - - # Generate the final predicted output using the function: - final_predicted_layer = tf.add( - bg_label_tf, - tf.multiply(tf.subtract(argmax_layer, bg_label_tf), argmax_mask), - name="ThreshArgMax", - ) - - return final_predicted_layer - - return ThreshArgMaxLayer(threshold, num_labels) + return ThreshArgMaxLayer(threshold, num_labels, default_ind) def _construct_model(self) -> None: """ @@ -449,17 +486,13 @@ def _construct_model(self) -> None: max_length = self._parameters["max_length"] max_char_encoding_id = self._parameters["max_char_encoding_id"] - # Encoding layer - def encoding_function(input_str: tf.Tensor) -> tf.Tensor: - char_in_vector = CharacterLevelCnnModel._char_encoding_layer( - input_str, max_char_encoding_id, max_length - ) - return char_in_vector - self._model.add(tf.keras.layers.Input(shape=(None,), dtype=tf.string)) self._model.add( - tf.keras.layers.Lambda(encoding_function, output_shape=tuple([max_length])) + EncodingLayer( + max_char_encoding_id=max_char_encoding_id, + max_len=max_length, + ), ) # Create a pre-trained weight matrix @@ -518,8 +551,8 @@ def encoding_function(input_str: tf.Tensor) -> tf.Tensor: argmax_layer = tf.keras.backend.argmax(self._model.output) # Create confidence layers - final_predicted_layer = CharacterLevelCnnModel._argmax_threshold_layer( - num_labels, threshold=0.0, default_ind=default_ind + final_predicted_layer = ThreshArgMaxLayer( + threshold_=0.0, num_labels_=num_labels, default_ind=default_ind ) argmax_outputs = self._model.outputs + [ @@ -578,8 +611,8 @@ def _reconstruct_model(self) -> None: argmax_layer = tf.keras.backend.argmax(final_softmax_layer) # Create confidence layers - final_predicted_layer = CharacterLevelCnnModel._argmax_threshold_layer( - num_labels, threshold=0.0, default_ind=default_ind + final_predicted_layer = ThreshArgMaxLayer( + threshold_=0.0, num_labels_=num_labels, default_ind=default_ind ) argmax_outputs = [final_softmax_layer] + [ From f2f93cf252f74d1b9b73336b49c84eb1fbf060ba Mon Sep 17 00:00:00 2001 From: Jeremy Goodsitt Date: Wed, 5 Jun 2024 12:00:12 -0500 Subject: [PATCH 06/18] refactor: update model to keras 3.0 --- .../labelers/character_level_cnn_model.py | 43 +++++++++++------- dataprofiler/labelers/labeler_utils.py | 2 +- requirements-ml.txt | 8 ++-- .../structured_model/keras_metadata.pb | 29 ------------ ...iables.data-00000-of-00001 => model.keras} | Bin 635392 -> 694678 bytes .../labelers/structured_model/saved_model.pb | Bin 544918 -> 0 bytes .../variables/variables.index | Bin 2660 -> 0 bytes .../unstructured_model/keras_metadata.pb | 29 ------------ ...iables.data-00000-of-00001 => model.keras} | Bin 635392 -> 694678 bytes .../unstructured_model/saved_model.pb | Bin 544918 -> 0 bytes .../variables/variables.index | Bin 2660 -> 0 bytes 11 files changed, 32 insertions(+), 79 deletions(-) delete mode 100644 resources/labelers/structured_model/keras_metadata.pb rename resources/labelers/structured_model/{variables/variables.data-00000-of-00001 => model.keras} (88%) delete mode 100644 resources/labelers/structured_model/saved_model.pb delete mode 100644 resources/labelers/structured_model/variables/variables.index delete mode 100644 resources/labelers/unstructured_model/keras_metadata.pb rename resources/labelers/unstructured_model/{variables/variables.data-00000-of-00001 => model.keras} (88%) delete mode 100644 resources/labelers/unstructured_model/saved_model.pb delete mode 100644 resources/labelers/unstructured_model/variables/variables.index diff --git a/dataprofiler/labelers/character_level_cnn_model.py b/dataprofiler/labelers/character_level_cnn_model.py index 2751dc2da..5a5c5a4c5 100644 --- a/dataprofiler/labelers/character_level_cnn_model.py +++ b/dataprofiler/labelers/character_level_cnn_model.py @@ -76,9 +76,25 @@ def create_glove_char(n_dims: int, source_file: str = None) -> None: @tf.keras.utils.register_keras_serializable(package="CharacterLevelCnnModel") class ThreshArgMaxLayer(tf.keras.layers.Layer): + """Keras layer applying a thresholded argmax.""" + def __init__( self, threshold_: float, num_labels_: int, default_ind: int = 1, *args, **kwargs ) -> None: + """Apply a minimum threshold to the argmax value. + + When below this threshold the index will be the default. + + :param num_labels: number of entities + :type num_labels: int + :param threshold: default set to 0 so all confidences pass. + :type threshold: float + :param default_ind: default index + :type default_ind: int + :return: final argmax threshold layer for the model + :return : tensor containing argmax thresholded integers, labels out + :rtype: tf.Tensor + """ super().__init__(*args, **kwargs) self._threshold_ = threshold_ self._num_labels_ = num_labels_ @@ -91,6 +107,7 @@ def __init__( ) def get_config(self): + """Return a serializable config for saving the layer.""" config = super().get_config().copy() config.update( { @@ -102,6 +119,7 @@ def get_config(self): return config def call(self, argmax_layer: tf.Tensor, confidence_layer: tf.Tensor) -> tf.Tensor: + """Apply the threshold argmax to the input tensor.""" threshold_at_argmax = tf.gather(self.thresh_vec, argmax_layer) confidence_max_layer = tf.keras.backend.max(confidence_layer, axis=2) @@ -130,6 +148,8 @@ def call(self, argmax_layer: tf.Tensor, confidence_layer: tf.Tensor) -> tf.Tenso @tf.keras.utils.register_keras_serializable(package="CharacterLevelCnnModel") class EncodingLayer(tf.keras.layers.Layer): + """Encodes strings to integers.""" + def __init__( self, max_char_encoding_id: int, max_len: int, *args, **kwargs ) -> None: @@ -147,6 +167,7 @@ def __init__( self.max_len = max_len def get_config(self): + """Return a serializable config for saving the layer.""" config = super().get_config().copy() config.update( { @@ -386,7 +407,7 @@ def save_to_disk(self, dirpath: str) -> None: labels_dirpath = os.path.join(dirpath, "label_mapping.json") with open(labels_dirpath, "w") as fp: json.dump(self.label_mapping, fp) - self._model.save(os.path.join(dirpath)) + self._model.save(os.path.join(dirpath, "model.keras")) @classmethod def load_from_disk(cls, dirpath: str) -> CharacterLevelCnnModel: @@ -407,15 +428,7 @@ def load_from_disk(cls, dirpath: str) -> CharacterLevelCnnModel: with open(labels_dirpath) as fp: label_mapping = json.load(fp) - # use f1 score metric - custom_objects = { - "F1Score": labeler_utils.F1Score( - num_classes=max(label_mapping.values()) + 1, average="micro" - ), - "CharacterLevelCnnModel": cls, - } - with tf.keras.utils.custom_object_scope(custom_objects): - tf_model = tf.keras.models.load_model(dirpath) + tf_model = tf.keras.models.load_model(os.path.join(dirpath, "model.keras")) loaded_model = cls(label_mapping, parameters) loaded_model._model = tf_model @@ -507,7 +520,6 @@ def _construct_model(self) -> None: ) embedding_dict = build_embd_dictionary(embed_file) - input_shape = tuple([max_length]) # Fill in the weight matrix: let pad and space be 0s for ascii_num in range(max_char_encoding_id): if chr(ascii_num) in embedding_dict: @@ -518,7 +530,6 @@ def _construct_model(self) -> None: max_char_encoding_id + 2, self._parameters["dim_embed"], weights=[embedding_matrix], - input_length=input_shape[0], trainable=True, ) ) @@ -536,7 +547,7 @@ def _construct_model(self) -> None: if self._parameters["dropout"]: self._model.add(tf.keras.layers.Dropout(self._parameters["dropout"])) # Add batch normalization, set fused = True for compactness - self._model.add(tf.keras.layers.BatchNormalization(fused=False, scale=True)) + self._model.add(tf.keras.layers.BatchNormalization(scale=True)) # Add the fully connected layers for size in self._parameters["size_fc"]: @@ -548,7 +559,7 @@ def _construct_model(self) -> None: self._model.add(tf.keras.layers.Dense(num_labels, activation="softmax")) # Output the model into a .pb file for TensorFlow - argmax_layer = tf.keras.backend.argmax(self._model.output) + argmax_layer = tf.keras.ops.argmax(self._model.outputs[0], axis=2) # Create confidence layers final_predicted_layer = ThreshArgMaxLayer( @@ -557,7 +568,7 @@ def _construct_model(self) -> None: argmax_outputs = self._model.outputs + [ argmax_layer, - final_predicted_layer(argmax_layer, self._model.output), + final_predicted_layer(argmax_layer, self._model.outputs[0]), ] self._model = tf.keras.Model(self._model.inputs, argmax_outputs) @@ -608,7 +619,7 @@ def _reconstruct_model(self) -> None: )(self._model.layers[-4].output) # Output the model into a .pb file for TensorFlow - argmax_layer = tf.keras.backend.argmax(final_softmax_layer) + argmax_layer = tf.keras.ops.argmax(final_softmax_layer, axis=2) # Create confidence layers final_predicted_layer = ThreshArgMaxLayer( diff --git a/dataprofiler/labelers/labeler_utils.py b/dataprofiler/labelers/labeler_utils.py index b6070ff72..00bae98dc 100644 --- a/dataprofiler/labelers/labeler_utils.py +++ b/dataprofiler/labelers/labeler_utils.py @@ -358,7 +358,7 @@ def __init__( def _zero_wt_init(name: str) -> tf.Variable: return self.add_weight( - name, shape=self.init_shape, initializer="zeros", dtype=self.dtype + name=name, shape=self.init_shape, initializer="zeros", dtype=self.dtype ) self.true_positives = _zero_wt_init("true_positives") diff --git a/requirements-ml.txt b/requirements-ml.txt index ff525fec1..6da08b313 100644 --- a/requirements-ml.txt +++ b/requirements-ml.txt @@ -1,7 +1,7 @@ scikit-learn>=0.23.2 -keras>=2.4.3,<3.0.0 +keras>=3.0.0 rapidfuzz>=2.6.1 -tensorflow>=2.6.4,<2.15.0; sys.platform != 'darwin' -tensorflow>=2.6.4,<2.15.0; sys_platform == 'darwin' and platform_machine != 'arm64' -tensorflow-macos>=2.6.4,<2.15.0; sys_platform == 'darwin' and platform_machine == 'arm64' +tensorflow>=2.16.0; sys.platform != 'darwin' +tensorflow>=2.16.0; sys_platform == 'darwin' and platform_machine != 'arm64' +tensorflow-macos>=2.16.0; sys_platform == 'darwin' and platform_machine == 'arm64' tqdm>=4.0.0 diff --git a/resources/labelers/structured_model/keras_metadata.pb b/resources/labelers/structured_model/keras_metadata.pb deleted file mode 100644 index dcc84a213..000000000 --- a/resources/labelers/structured_model/keras_metadata.pb +++ /dev/null @@ -1,29 +0,0 @@ - -ã`root"_tf_keras_network*Á`{"name": "functional_1", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "must_restore_from_config": false, "class_name": "Functional", "config": {"name": "functional_1", "layers": [{"class_name": "InputLayer", "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, null]}, "dtype": "string", "sparse": false, "ragged": false, "name": "input_1"}, "name": "input_1", "inbound_nodes": []}, {"class_name": "Lambda", "config": {"name": "lambda", "trainable": true, "dtype": "float32", "function": {"class_name": "__tuple__", "items": ["4wEAAAAAAAAAAgAAAAQAAAATAAAAcxIAAAB0AGoBfACIAIgBgwN9AXwBUwApAU4pAtoWQ2hhcmFj\ndGVyTGV2ZWxDbm5Nb2RlbNoUX2NoYXJfZW5jb2RpbmdfbGF5ZXIpAtoJaW5wdXRfc3RyWg5jaGFy\nX2luX3ZlY3RvcikC2hRtYXhfY2hhcl9lbmNvZGluZ19pZNoKbWF4X2xlbmd0aKkA+lMvaG9tZS91\nYnVudHUvbmV3LWRwL0RhdGFQcm9maWxlci9kYXRhcHJvZmlsZXIvbGFiZWxlcnMvY2hhcmFjdGVy\nX2xldmVsX2Nubl9tb2RlbC5wedoRZW5jb2RpbmdfZnVuY3Rpb25TAgAAcwYAAAAAAQQBCgE=\n", null, {"class_name": "__tuple__", "items": [127, 3400]}]}, "function_type": "lambda", "module": "dataprofiler.labelers.character_level_cnn_model", "output_shape": {"class_name": "__tuple__", "items": [3400]}, "output_shape_type": "raw", "output_shape_module": null, "arguments": {}}, "name": "lambda", "inbound_nodes": [[["input_1", 0, 0, {}]]]}, {"class_name": "Embedding", "config": {"name": "embedding", "trainable": true, "batch_input_shape": {"class_name": "__tuple__", "items": [null, 3400]}, "dtype": "float32", "input_dim": 129, "output_dim": 64, "embeddings_initializer": {"class_name": "RandomUniform", "config": {"minval": -0.05, "maxval": 0.05, "seed": null}}, "embeddings_regularizer": null, "activity_regularizer": null, "embeddings_constraint": null, "mask_zero": false, "input_length": 3400}, "name": "embedding", "inbound_nodes": [[["lambda", 0, 0, {}]]]}, {"class_name": "Conv1D", "config": {"name": "conv1d", "trainable": true, "dtype": "float32", "filters": 48, "kernel_size": {"class_name": "__tuple__", "items": [13]}, "strides": {"class_name": "__tuple__", "items": [1]}, "padding": "same", "data_format": "channels_last", "dilation_rate": {"class_name": "__tuple__", "items": [1]}, "groups": 1, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "name": "conv1d", "inbound_nodes": [[["embedding", 0, 0, {}]]]}, {"class_name": "Dropout", "config": {"name": "dropout", "trainable": true, "dtype": "float32", "rate": 0.073, "noise_shape": null, "seed": null}, "name": "dropout", "inbound_nodes": [[["conv1d", 0, 0, {}]]]}, {"class_name": "BatchNormalization", "config": {"name": "batch_normalization", "trainable": true, "dtype": "float32", "axis": [2], "momentum": 0.99, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "name": "batch_normalization", "inbound_nodes": [[["dropout", 0, 0, {}]]]}, {"class_name": "Conv1D", "config": {"name": "conv1d_1", "trainable": true, "dtype": "float32", "filters": 48, "kernel_size": {"class_name": "__tuple__", "items": [13]}, "strides": {"class_name": "__tuple__", "items": [1]}, "padding": "same", "data_format": "channels_last", "dilation_rate": {"class_name": "__tuple__", "items": [1]}, "groups": 1, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "name": "conv1d_1", "inbound_nodes": [[["batch_normalization", 0, 0, {}]]]}, {"class_name": "Dropout", "config": {"name": "dropout_1", "trainable": true, "dtype": "float32", "rate": 0.073, "noise_shape": null, "seed": null}, "name": "dropout_1", "inbound_nodes": [[["conv1d_1", 0, 0, {}]]]}, {"class_name": "BatchNormalization", "config": {"name": "batch_normalization_1", "trainable": true, "dtype": "float32", "axis": [2], "momentum": 0.99, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "name": "batch_normalization_1", "inbound_nodes": [[["dropout_1", 0, 0, {}]]]}, {"class_name": "Conv1D", "config": {"name": "conv1d_2", "trainable": true, "dtype": "float32", "filters": 48, "kernel_size": {"class_name": "__tuple__", "items": [13]}, "strides": {"class_name": "__tuple__", "items": [1]}, "padding": "same", "data_format": "channels_last", "dilation_rate": {"class_name": "__tuple__", "items": [1]}, "groups": 1, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "name": "conv1d_2", "inbound_nodes": [[["batch_normalization_1", 0, 0, {}]]]}, {"class_name": "Dropout", "config": {"name": "dropout_2", "trainable": true, "dtype": "float32", "rate": 0.073, "noise_shape": null, "seed": null}, "name": "dropout_2", "inbound_nodes": [[["conv1d_2", 0, 0, {}]]]}, {"class_name": "BatchNormalization", "config": {"name": "batch_normalization_2", "trainable": true, "dtype": "float32", "axis": [2], "momentum": 0.99, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "name": "batch_normalization_2", "inbound_nodes": [[["dropout_2", 0, 0, {}]]]}, {"class_name": "Conv1D", "config": {"name": "conv1d_3", "trainable": true, "dtype": "float32", "filters": 48, "kernel_size": {"class_name": "__tuple__", "items": [13]}, "strides": {"class_name": "__tuple__", "items": [1]}, "padding": "same", "data_format": "channels_last", "dilation_rate": {"class_name": "__tuple__", "items": [1]}, "groups": 1, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "name": "conv1d_3", "inbound_nodes": [[["batch_normalization_2", 0, 0, {}]]]}, {"class_name": "Dropout", "config": {"name": "dropout_3", "trainable": true, "dtype": "float32", "rate": 0.073, "noise_shape": null, "seed": null}, "name": "dropout_3", "inbound_nodes": [[["conv1d_3", 0, 0, {}]]]}, {"class_name": "BatchNormalization", "config": {"name": "batch_normalization_3", "trainable": true, "dtype": "float32", "axis": [2], "momentum": 0.99, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "name": "batch_normalization_3", "inbound_nodes": [[["dropout_3", 0, 0, {}]]]}, {"class_name": "Dense", "config": {"name": "dense", "trainable": true, "dtype": "float32", "units": 96, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "name": "dense", "inbound_nodes": [[["batch_normalization_3", 0, 0, {}]]]}, {"class_name": "Dropout", "config": {"name": "dropout_4", "trainable": true, "dtype": "float32", "rate": 0.073, "noise_shape": null, "seed": null}, "name": "dropout_4", "inbound_nodes": [[["dense", 0, 0, {}]]]}, {"class_name": "Dense", "config": {"name": "dense_1", "trainable": true, "dtype": "float32", "units": 96, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "name": "dense_1", "inbound_nodes": [[["dropout_4", 0, 0, {}]]]}, {"class_name": "Dropout", "config": {"name": "dropout_5", "trainable": true, "dtype": "float32", "rate": 0.073, "noise_shape": null, "seed": null}, "name": "dropout_5", "inbound_nodes": [[["dense_1", 0, 0, {}]]]}, {"class_name": "Dense", "config": {"name": "dense_2", "trainable": true, "dtype": "float32", "units": 24, "activation": "softmax", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "name": "dense_2", "inbound_nodes": [[["dropout_5", 0, 0, {}]]]}, {"class_name": "TensorFlowOpLayer", "config": {"name": "ArgMax", "trainable": true, "dtype": "float32", "node_def": {"name": "ArgMax", "op": "ArgMax", "input": ["dense_2/truediv", "ArgMax/dimension"], "attr": {"Tidx": {"type": "DT_INT32"}, "output_type": {"type": "DT_INT64"}, "T": {"type": "DT_FLOAT"}}}, "constants": {"1": -1}}, "name": "tf_op_layer_ArgMax", "inbound_nodes": [[["dense_2", 0, 0, {}]]]}, {"class_name": "ThreshArgMaxLayer", "config": {"layer was saved without config": true}, "name": "thresh_arg_max_layer", "inbound_nodes": [[["tf_op_layer_ArgMax", 0, 0, {"confidence_layer": ["dense_2", 0, 0]}]]]}], "input_layers": [["input_1", 0, 0]], "output_layers": [["dense_2", 0, 0], ["tf_op_layer_ArgMax", 0, 0], ["thresh_arg_max_layer", 0, 0]]}, "shared_object_id": 52, "input_spec": [{"class_name": "InputSpec", "config": {"dtype": null, "shape": {"class_name": "__tuple__", "items": [null, null]}, "ndim": 2, "max_ndim": null, "min_ndim": null, "axes": {}}}], "build_input_shape": {"class_name": "TensorShape", "items": [null, null]}, "is_graph_network": true, "full_save_spec": {"class_name": "__tuple__", "items": [[{"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [null, null]}, "string", "input_1"]}], {}]}, "save_spec": {"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [null, null]}, "string", "input_1"]}, "keras_version": "2.6.0", "backend": "tensorflow", "model_config": {"class_name": "Functional"}, "training_config": {"loss": {"dense_2": "categorical_crossentropy"}, "metrics": [[{"class_name": "MeanMetricWrapper", "config": {"name": "acc", "dtype": "float32", "fn": "categorical_accuracy"}, "shared_object_id": 54}, {"class_name": "Custom>F1Score", "config": {"name": "dense_2_f1_score", "dtype": "float32", "num_classes": 24, "average": "micro", "threshold": null}, "shared_object_id": 55}], [null], [null]], "weighted_metrics": null, "loss_weights": null, "optimizer_config": {"class_name": "Adam", "config": {"name": "Adam", "learning_rate": 0.0010000000474974513, "decay": 0.0, "beta_1": 0.8999999761581421, "beta_2": 0.9990000128746033, "epsilon": 1e-07, "amsgrad": false}}}}2 -ú root.layer-0"_tf_keras_input_layer*Ê{"class_name": "InputLayer", "name": "input_1", "dtype": "string", "sparse": false, "ragged": false, "batch_input_shape": {"class_name": "__tuple__", "items": [null, null]}, "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, null]}, "dtype": "string", "sparse": false, "ragged": false, "name": "input_1"}}2 -Å root.layer-1"_tf_keras_layer*›{"name": "lambda", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Lambda", "config": {"name": "lambda", "trainable": true, "dtype": "float32", "function": {"class_name": "__tuple__", "items": ["4wEAAAAAAAAAAgAAAAQAAAATAAAAcxIAAAB0AGoBfACIAIgBgwN9AXwBUwApAU4pAtoWQ2hhcmFj\ndGVyTGV2ZWxDbm5Nb2RlbNoUX2NoYXJfZW5jb2RpbmdfbGF5ZXIpAtoJaW5wdXRfc3RyWg5jaGFy\nX2luX3ZlY3RvcikC2hRtYXhfY2hhcl9lbmNvZGluZ19pZNoKbWF4X2xlbmd0aKkA+lMvaG9tZS91\nYnVudHUvbmV3LWRwL0RhdGFQcm9maWxlci9kYXRhcHJvZmlsZXIvbGFiZWxlcnMvY2hhcmFjdGVy\nX2xldmVsX2Nubl9tb2RlbC5wedoRZW5jb2RpbmdfZnVuY3Rpb25TAgAAcwYAAAAAAQQBCgE=\n", null, {"class_name": "__tuple__", "items": [127, 3400]}]}, "function_type": "lambda", "module": "dataprofiler.labelers.character_level_cnn_model", "output_shape": {"class_name": "__tuple__", "items": [3400]}, "output_shape_type": "raw", "output_shape_module": null, "arguments": {}}, "inbound_nodes": [[["input_1", 0, 0, {}]]], "shared_object_id": 1}2 -‚root.layer_with_weights-0"_tf_keras_layer*Ë{"name": "embedding", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": {"class_name": "__tuple__", "items": [null, 3400]}, "stateful": false, "must_restore_from_config": false, "class_name": "Embedding", "config": {"name": "embedding", "trainable": true, "batch_input_shape": {"class_name": "__tuple__", "items": [null, 3400]}, "dtype": "float32", "input_dim": 129, "output_dim": 64, "embeddings_initializer": {"class_name": "RandomUniform", "config": {"minval": -0.05, "maxval": 0.05, "seed": null}, "shared_object_id": 2}, "embeddings_regularizer": null, "activity_regularizer": null, "embeddings_constraint": null, "mask_zero": false, "input_length": 3400}, "inbound_nodes": [[["lambda", 0, 0, {}]]], "shared_object_id": 3, "build_input_shape": {"class_name": "TensorShape", "items": [null, null]}}2 -ç root.layer_with_weights-1"_tf_keras_layer*° {"name": "conv1d", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Conv1D", "config": {"name": "conv1d", "trainable": true, "dtype": "float32", "filters": 48, "kernel_size": {"class_name": "__tuple__", "items": [13]}, "strides": {"class_name": "__tuple__", "items": [1]}, "padding": "same", "data_format": "channels_last", "dilation_rate": {"class_name": "__tuple__", "items": [1]}, "groups": 1, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 4}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 5}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["embedding", 0, 0, {}]]], "shared_object_id": 6, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 3, "axes": {"-1": 64}}, "shared_object_id": 56}, "build_input_shape": {"class_name": "TensorShape", "items": [null, null, 64]}}2 -¦ root.layer-4"_tf_keras_layer*ü{"name": "dropout", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dropout", "config": {"name": "dropout", "trainable": true, "dtype": "float32", "rate": 0.073, "noise_shape": null, "seed": null}, "inbound_nodes": [[["conv1d", 0, 0, {}]]], "shared_object_id": 7}2 -· root.layer_with_weights-2"_tf_keras_layer*€ {"name": "batch_normalization", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "BatchNormalization", "config": {"name": "batch_normalization", "trainable": true, "dtype": "float32", "axis": [2], "momentum": 0.99, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 8}, "gamma_initializer": {"class_name": "Ones", "config": {}, "shared_object_id": 9}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 10}, "moving_variance_initializer": {"class_name": "Ones", "config": {}, "shared_object_id": 11}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["dropout", 0, 0, {}]]], "shared_object_id": 12, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": 3, "max_ndim": null, "min_ndim": null, "axes": {"2": 48}}, "shared_object_id": 57}, "build_input_shape": {"class_name": "TensorShape", "items": [null, null, 48]}}2 -ø root.layer_with_weights-3"_tf_keras_layer*Á {"name": "conv1d_1", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Conv1D", "config": {"name": "conv1d_1", "trainable": true, "dtype": "float32", "filters": 48, "kernel_size": {"class_name": "__tuple__", "items": [13]}, "strides": {"class_name": "__tuple__", "items": [1]}, "padding": "same", "data_format": "channels_last", "dilation_rate": {"class_name": "__tuple__", "items": [1]}, "groups": 1, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 13}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 14}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["batch_normalization", 0, 0, {}]]], "shared_object_id": 15, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 3, "axes": {"-1": 48}}, "shared_object_id": 58}, "build_input_shape": {"class_name": "TensorShape", "items": [null, null, 48]}}2 -­ root.layer-7"_tf_keras_layer*ƒ{"name": "dropout_1", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dropout", "config": {"name": "dropout_1", "trainable": true, "dtype": "float32", "rate": 0.073, "noise_shape": null, "seed": null}, "inbound_nodes": [[["conv1d_1", 0, 0, {}]]], "shared_object_id": 16}2 -¿  root.layer_with_weights-4"_tf_keras_layer*ˆ {"name": "batch_normalization_1", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "BatchNormalization", "config": {"name": "batch_normalization_1", "trainable": true, "dtype": "float32", "axis": [2], "momentum": 0.99, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 17}, "gamma_initializer": {"class_name": "Ones", "config": {}, "shared_object_id": 18}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 19}, "moving_variance_initializer": {"class_name": "Ones", "config": {}, "shared_object_id": 20}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["dropout_1", 0, 0, {}]]], "shared_object_id": 21, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": 3, "max_ndim": null, "min_ndim": null, "axes": {"2": 48}}, "shared_object_id": 59}, "build_input_shape": {"class_name": "TensorShape", "items": [null, null, 48]}}2 -ú  -root.layer_with_weights-5"_tf_keras_layer*à {"name": "conv1d_2", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Conv1D", "config": {"name": "conv1d_2", "trainable": true, "dtype": "float32", "filters": 48, "kernel_size": {"class_name": "__tuple__", "items": [13]}, "strides": {"class_name": "__tuple__", "items": [1]}, "padding": "same", "data_format": "channels_last", "dilation_rate": {"class_name": "__tuple__", "items": [1]}, "groups": 1, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 22}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 23}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["batch_normalization_1", 0, 0, {}]]], "shared_object_id": 24, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 3, "axes": {"-1": 48}}, "shared_object_id": 60}, "build_input_shape": {"class_name": "TensorShape", "items": [null, null, 48]}}2 -®  root.layer-10"_tf_keras_layer*ƒ{"name": "dropout_2", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dropout", "config": {"name": "dropout_2", "trainable": true, "dtype": "float32", "rate": 0.073, "noise_shape": null, "seed": null}, "inbound_nodes": [[["conv1d_2", 0, 0, {}]]], "shared_object_id": 25}2 -¿  root.layer_with_weights-6"_tf_keras_layer*ˆ {"name": "batch_normalization_2", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "BatchNormalization", "config": {"name": "batch_normalization_2", "trainable": true, "dtype": "float32", "axis": [2], "momentum": 0.99, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 26}, "gamma_initializer": {"class_name": "Ones", "config": {}, "shared_object_id": 27}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 28}, "moving_variance_initializer": {"class_name": "Ones", "config": {}, "shared_object_id": 29}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["dropout_2", 0, 0, {}]]], "shared_object_id": 30, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": 3, "max_ndim": null, "min_ndim": null, "axes": {"2": 48}}, "shared_object_id": 61}, "build_input_shape": {"class_name": "TensorShape", "items": [null, null, 48]}}2 -ú  root.layer_with_weights-7"_tf_keras_layer*à {"name": "conv1d_3", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Conv1D", "config": {"name": "conv1d_3", "trainable": true, "dtype": "float32", "filters": 48, "kernel_size": {"class_name": "__tuple__", "items": [13]}, "strides": {"class_name": "__tuple__", "items": [1]}, "padding": "same", "data_format": "channels_last", "dilation_rate": {"class_name": "__tuple__", "items": [1]}, "groups": 1, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 31}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 32}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["batch_normalization_2", 0, 0, {}]]], "shared_object_id": 33, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 3, "axes": {"-1": 48}}, "shared_object_id": 62}, "build_input_shape": {"class_name": "TensorShape", "items": [null, null, 48]}}2 -® root.layer-13"_tf_keras_layer*ƒ{"name": "dropout_3", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dropout", "config": {"name": "dropout_3", "trainable": true, "dtype": "float32", "rate": 0.073, "noise_shape": null, "seed": null}, "inbound_nodes": [[["conv1d_3", 0, 0, {}]]], "shared_object_id": 34}2 -¿ root.layer_with_weights-8"_tf_keras_layer*ˆ {"name": "batch_normalization_3", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "BatchNormalization", "config": {"name": "batch_normalization_3", "trainable": true, "dtype": "float32", "axis": [2], "momentum": 0.99, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 35}, "gamma_initializer": {"class_name": "Ones", "config": {}, "shared_object_id": 36}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 37}, "moving_variance_initializer": {"class_name": "Ones", "config": {}, "shared_object_id": 38}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["dropout_3", 0, 0, {}]]], "shared_object_id": 39, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": 3, "max_ndim": null, "min_ndim": null, "axes": {"2": 48}}, "shared_object_id": 63}, "build_input_shape": {"class_name": "TensorShape", "items": [null, null, 48]}}2 -„root.layer_with_weights-9"_tf_keras_layer*Í{"name": "dense", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dense", "config": {"name": "dense", "trainable": true, "dtype": "float32", "units": 96, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 40}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 41}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["batch_normalization_3", 0, 0, {}]]], "shared_object_id": 42, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 2, "axes": {"-1": 48}}, "shared_object_id": 64}, "build_input_shape": {"class_name": "TensorShape", "items": [null, null, 48]}}2 -« root.layer-16"_tf_keras_layer*€{"name": "dropout_4", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dropout", "config": {"name": "dropout_4", "trainable": true, "dtype": "float32", "rate": 0.073, "noise_shape": null, "seed": null}, "inbound_nodes": [[["dense", 0, 0, {}]]], "shared_object_id": 43}2 -ýroot.layer_with_weights-10"_tf_keras_layer*Å{"name": "dense_1", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dense", "config": {"name": "dense_1", "trainable": true, "dtype": "float32", "units": 96, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 44}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 45}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["dropout_4", 0, 0, {}]]], "shared_object_id": 46, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 2, "axes": {"-1": 96}}, "shared_object_id": 65}, "build_input_shape": {"class_name": "TensorShape", "items": [null, null, 96]}}2 -­ root.layer-18"_tf_keras_layer*‚{"name": "dropout_5", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dropout", "config": {"name": "dropout_5", "trainable": true, "dtype": "float32", "rate": 0.073, "noise_shape": null, "seed": null}, "inbound_nodes": [[["dense_1", 0, 0, {}]]], "shared_object_id": 47}2 -€root.layer_with_weights-11"_tf_keras_layer*È{"name": "dense_2", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dense", "config": {"name": "dense_2", "trainable": true, "dtype": "float32", "units": 24, "activation": "softmax", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 48}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 49}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["dropout_5", 0, 0, {}]]], "shared_object_id": 50, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 2, "axes": {"-1": 96}}, "shared_object_id": 66}, "build_input_shape": {"class_name": "TensorShape", "items": [null, null, 96]}}2 -í root.layer-20"_tf_keras_layer*Â{"name": "tf_op_layer_ArgMax", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": true, "class_name": "TensorFlowOpLayer", "config": {"name": "ArgMax", "trainable": true, "dtype": "float32", "node_def": {"name": "ArgMax", "op": "ArgMax", "input": ["dense_2/truediv", "ArgMax/dimension"], "attr": {"Tidx": {"type": "DT_INT32"}, "output_type": {"type": "DT_INT64"}, "T": {"type": "DT_FLOAT"}}}, "constants": {"1": -1}}, "inbound_nodes": [[["dense_2", 0, 0, {}]]], "shared_object_id": 51}2 -Æroot.layer_with_weights-12"_tf_keras_layer*Ž{"name": "thresh_arg_max_layer", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "ThreshArgMaxLayer", "config": {"layer was saved without config": true}}2 -º“root.keras_api.metrics.0"_tf_keras_metric*‚{"class_name": "Mean", "name": "loss", "dtype": "float32", "config": {"name": "loss", "dtype": "float32"}, "shared_object_id": 67}2 -Ê”root.keras_api.metrics.1"_tf_keras_metric*’{"class_name": "Mean", "name": "dense_2_loss", "dtype": "float32", "config": {"name": "dense_2_loss", "dtype": "float32"}, "shared_object_id": 68}2 -ã•root.keras_api.metrics.2"_tf_keras_metric*«{"class_name": "MeanMetricWrapper", "name": "acc", "dtype": "float32", "config": {"name": "acc", "dtype": "float32", "fn": "categorical_accuracy"}, "shared_object_id": 54}2 -––root.keras_api.metrics.3"_tf_keras_metric*Þ{"class_name": "Custom>F1Score", "name": "dense_2_f1_score", "dtype": "float32", "config": {"name": "dense_2_f1_score", "dtype": "float32", "num_classes": 24, "average": "micro", "threshold": null}, "shared_object_id": 55}2 \ No newline at end of file diff --git a/resources/labelers/structured_model/variables/variables.data-00000-of-00001 b/resources/labelers/structured_model/model.keras similarity index 88% rename from resources/labelers/structured_model/variables/variables.data-00000-of-00001 rename to resources/labelers/structured_model/model.keras index 95732bf16a505547c7a91a728e53951fa1f4d850..cbf03eada1c584ba135d59c2fd05031f06e9b75e 100644 GIT binary patch delta 32323 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 diff --git a/resources/labelers/structured_model/variables/variables.index b/resources/labelers/structured_model/variables/variables.index deleted file mode 100644 index 627e9a5776c6bef4df06e87785049587a60eab50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2660 zcmbW1ZAcVB7{}-CEZ1JRx?9CeW4G&SrI$TVH!FfV{NnkU3Jt|_q4lJi6Ew+ zHxx07vZ62u34(|sD2Ui1$qz+FekkmN^hQxc7?n{`vr}weqML1DcVXf8{O9@2vjf0n z#*yJ<93XRsTv!w?EGgSiygm{tC=JUS3f6`TBl4Q^P+1X^>;c@X&win=MLNCm#eR_I zZiX=>E-P)Ss6joZ*2cwvSlikj)x{;DNTj^Dpdu39BvyvXi%GT0P-#V&ao{qyahW7( zVCT#gEa%o+b)_W{VOWG`t~-Y=<*vohrVLpGP6^Vbj93h9%CJRv7P)i9dZi@})2V{tkcK*&XQ%R6czmNU!Q@TD+;lVW7r)0Tps^IGbGRvs<=Fsba5aa{ z`vv5Znnw2C2l=!9;vgp=(kzF;%cwSQ4t4ni)bErgE??_qc`vPlbPj#;3)Rxeduo0f zpKd1;qZe=&MG{;;uz+3Q4T^eW48|Mf4p{r|5isSab7Lg3ebt?s7S$UVQu?z{kH!3idVyQ~6o6$GCY`V0MBRP_IMEp7LZXz*n0K zfShCi@CyKSOZOG??Jyt4_?e5q;nF}4YkfO7K7&8ZGX1RE{Pgdu>MQD+*S==-C*`u& Af&c&j diff --git a/resources/labelers/unstructured_model/keras_metadata.pb b/resources/labelers/unstructured_model/keras_metadata.pb deleted file mode 100644 index dcc84a213..000000000 --- a/resources/labelers/unstructured_model/keras_metadata.pb +++ /dev/null @@ -1,29 +0,0 @@ - -ã`root"_tf_keras_network*Á`{"name": "functional_1", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "must_restore_from_config": false, "class_name": "Functional", "config": {"name": "functional_1", "layers": [{"class_name": "InputLayer", "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, null]}, "dtype": "string", "sparse": false, "ragged": false, "name": "input_1"}, "name": "input_1", "inbound_nodes": []}, {"class_name": "Lambda", "config": {"name": "lambda", "trainable": true, "dtype": "float32", "function": {"class_name": "__tuple__", "items": ["4wEAAAAAAAAAAgAAAAQAAAATAAAAcxIAAAB0AGoBfACIAIgBgwN9AXwBUwApAU4pAtoWQ2hhcmFj\ndGVyTGV2ZWxDbm5Nb2RlbNoUX2NoYXJfZW5jb2RpbmdfbGF5ZXIpAtoJaW5wdXRfc3RyWg5jaGFy\nX2luX3ZlY3RvcikC2hRtYXhfY2hhcl9lbmNvZGluZ19pZNoKbWF4X2xlbmd0aKkA+lMvaG9tZS91\nYnVudHUvbmV3LWRwL0RhdGFQcm9maWxlci9kYXRhcHJvZmlsZXIvbGFiZWxlcnMvY2hhcmFjdGVy\nX2xldmVsX2Nubl9tb2RlbC5wedoRZW5jb2RpbmdfZnVuY3Rpb25TAgAAcwYAAAAAAQQBCgE=\n", null, {"class_name": "__tuple__", "items": [127, 3400]}]}, "function_type": "lambda", "module": "dataprofiler.labelers.character_level_cnn_model", "output_shape": {"class_name": "__tuple__", "items": [3400]}, "output_shape_type": "raw", "output_shape_module": null, "arguments": {}}, "name": "lambda", "inbound_nodes": [[["input_1", 0, 0, {}]]]}, {"class_name": "Embedding", "config": {"name": "embedding", "trainable": true, "batch_input_shape": {"class_name": "__tuple__", "items": [null, 3400]}, "dtype": "float32", "input_dim": 129, "output_dim": 64, "embeddings_initializer": {"class_name": "RandomUniform", "config": {"minval": -0.05, "maxval": 0.05, "seed": null}}, "embeddings_regularizer": null, "activity_regularizer": null, "embeddings_constraint": null, "mask_zero": false, "input_length": 3400}, "name": "embedding", "inbound_nodes": [[["lambda", 0, 0, {}]]]}, {"class_name": "Conv1D", "config": {"name": "conv1d", "trainable": true, "dtype": "float32", "filters": 48, "kernel_size": {"class_name": "__tuple__", "items": [13]}, "strides": {"class_name": "__tuple__", "items": [1]}, "padding": "same", "data_format": "channels_last", "dilation_rate": {"class_name": "__tuple__", "items": [1]}, "groups": 1, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "name": "conv1d", "inbound_nodes": [[["embedding", 0, 0, {}]]]}, {"class_name": "Dropout", "config": {"name": "dropout", "trainable": true, "dtype": "float32", "rate": 0.073, "noise_shape": null, "seed": null}, "name": "dropout", "inbound_nodes": [[["conv1d", 0, 0, {}]]]}, {"class_name": "BatchNormalization", "config": {"name": "batch_normalization", "trainable": true, "dtype": "float32", "axis": [2], "momentum": 0.99, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "name": "batch_normalization", "inbound_nodes": [[["dropout", 0, 0, {}]]]}, {"class_name": "Conv1D", "config": {"name": "conv1d_1", "trainable": true, "dtype": "float32", "filters": 48, "kernel_size": {"class_name": "__tuple__", "items": [13]}, "strides": {"class_name": "__tuple__", "items": [1]}, "padding": "same", "data_format": "channels_last", "dilation_rate": {"class_name": "__tuple__", "items": [1]}, "groups": 1, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "name": "conv1d_1", "inbound_nodes": [[["batch_normalization", 0, 0, {}]]]}, {"class_name": "Dropout", "config": {"name": "dropout_1", "trainable": true, "dtype": "float32", "rate": 0.073, "noise_shape": null, "seed": null}, "name": "dropout_1", "inbound_nodes": [[["conv1d_1", 0, 0, {}]]]}, {"class_name": "BatchNormalization", "config": {"name": "batch_normalization_1", "trainable": true, "dtype": "float32", "axis": [2], "momentum": 0.99, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "name": "batch_normalization_1", "inbound_nodes": [[["dropout_1", 0, 0, {}]]]}, {"class_name": "Conv1D", "config": {"name": "conv1d_2", "trainable": true, "dtype": "float32", "filters": 48, "kernel_size": {"class_name": "__tuple__", "items": [13]}, "strides": {"class_name": "__tuple__", "items": [1]}, "padding": "same", "data_format": "channels_last", "dilation_rate": {"class_name": "__tuple__", "items": [1]}, "groups": 1, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "name": "conv1d_2", "inbound_nodes": [[["batch_normalization_1", 0, 0, {}]]]}, {"class_name": "Dropout", "config": {"name": "dropout_2", "trainable": true, "dtype": "float32", "rate": 0.073, "noise_shape": null, "seed": null}, "name": "dropout_2", "inbound_nodes": [[["conv1d_2", 0, 0, {}]]]}, {"class_name": "BatchNormalization", "config": {"name": "batch_normalization_2", "trainable": true, "dtype": "float32", "axis": [2], "momentum": 0.99, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "name": "batch_normalization_2", "inbound_nodes": [[["dropout_2", 0, 0, {}]]]}, {"class_name": "Conv1D", "config": {"name": "conv1d_3", "trainable": true, "dtype": "float32", "filters": 48, "kernel_size": {"class_name": "__tuple__", "items": [13]}, "strides": {"class_name": "__tuple__", "items": [1]}, "padding": "same", "data_format": "channels_last", "dilation_rate": {"class_name": "__tuple__", "items": [1]}, "groups": 1, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "name": "conv1d_3", "inbound_nodes": [[["batch_normalization_2", 0, 0, {}]]]}, {"class_name": "Dropout", "config": {"name": "dropout_3", "trainable": true, "dtype": "float32", "rate": 0.073, "noise_shape": null, "seed": null}, "name": "dropout_3", "inbound_nodes": [[["conv1d_3", 0, 0, {}]]]}, {"class_name": "BatchNormalization", "config": {"name": "batch_normalization_3", "trainable": true, "dtype": "float32", "axis": [2], "momentum": 0.99, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}}, "gamma_initializer": {"class_name": "Ones", "config": {}}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}}, "moving_variance_initializer": {"class_name": "Ones", "config": {}}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "name": "batch_normalization_3", "inbound_nodes": [[["dropout_3", 0, 0, {}]]]}, {"class_name": "Dense", "config": {"name": "dense", "trainable": true, "dtype": "float32", "units": 96, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "name": "dense", "inbound_nodes": [[["batch_normalization_3", 0, 0, {}]]]}, {"class_name": "Dropout", "config": {"name": "dropout_4", "trainable": true, "dtype": "float32", "rate": 0.073, "noise_shape": null, "seed": null}, "name": "dropout_4", "inbound_nodes": [[["dense", 0, 0, {}]]]}, {"class_name": "Dense", "config": {"name": "dense_1", "trainable": true, "dtype": "float32", "units": 96, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "name": "dense_1", "inbound_nodes": [[["dropout_4", 0, 0, {}]]]}, {"class_name": "Dropout", "config": {"name": "dropout_5", "trainable": true, "dtype": "float32", "rate": 0.073, "noise_shape": null, "seed": null}, "name": "dropout_5", "inbound_nodes": [[["dense_1", 0, 0, {}]]]}, {"class_name": "Dense", "config": {"name": "dense_2", "trainable": true, "dtype": "float32", "units": 24, "activation": "softmax", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "name": "dense_2", "inbound_nodes": [[["dropout_5", 0, 0, {}]]]}, {"class_name": "TensorFlowOpLayer", "config": {"name": "ArgMax", "trainable": true, "dtype": "float32", "node_def": {"name": "ArgMax", "op": "ArgMax", "input": ["dense_2/truediv", "ArgMax/dimension"], "attr": {"Tidx": {"type": "DT_INT32"}, "output_type": {"type": "DT_INT64"}, "T": {"type": "DT_FLOAT"}}}, "constants": {"1": -1}}, "name": "tf_op_layer_ArgMax", "inbound_nodes": [[["dense_2", 0, 0, {}]]]}, {"class_name": "ThreshArgMaxLayer", "config": {"layer was saved without config": true}, "name": "thresh_arg_max_layer", "inbound_nodes": [[["tf_op_layer_ArgMax", 0, 0, {"confidence_layer": ["dense_2", 0, 0]}]]]}], "input_layers": [["input_1", 0, 0]], "output_layers": [["dense_2", 0, 0], ["tf_op_layer_ArgMax", 0, 0], ["thresh_arg_max_layer", 0, 0]]}, "shared_object_id": 52, "input_spec": [{"class_name": "InputSpec", "config": {"dtype": null, "shape": {"class_name": "__tuple__", "items": [null, null]}, "ndim": 2, "max_ndim": null, "min_ndim": null, "axes": {}}}], "build_input_shape": {"class_name": "TensorShape", "items": [null, null]}, "is_graph_network": true, "full_save_spec": {"class_name": "__tuple__", "items": [[{"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [null, null]}, "string", "input_1"]}], {}]}, "save_spec": {"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [null, null]}, "string", "input_1"]}, "keras_version": "2.6.0", "backend": "tensorflow", "model_config": {"class_name": "Functional"}, "training_config": {"loss": {"dense_2": "categorical_crossentropy"}, "metrics": [[{"class_name": "MeanMetricWrapper", "config": {"name": "acc", "dtype": "float32", "fn": "categorical_accuracy"}, "shared_object_id": 54}, {"class_name": "Custom>F1Score", "config": {"name": "dense_2_f1_score", "dtype": "float32", "num_classes": 24, "average": "micro", "threshold": null}, "shared_object_id": 55}], [null], [null]], "weighted_metrics": null, "loss_weights": null, "optimizer_config": {"class_name": "Adam", "config": {"name": "Adam", "learning_rate": 0.0010000000474974513, "decay": 0.0, "beta_1": 0.8999999761581421, "beta_2": 0.9990000128746033, "epsilon": 1e-07, "amsgrad": false}}}}2 -ú root.layer-0"_tf_keras_input_layer*Ê{"class_name": "InputLayer", "name": "input_1", "dtype": "string", "sparse": false, "ragged": false, "batch_input_shape": {"class_name": "__tuple__", "items": [null, null]}, "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, null]}, "dtype": "string", "sparse": false, "ragged": false, "name": "input_1"}}2 -Å root.layer-1"_tf_keras_layer*›{"name": "lambda", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Lambda", "config": {"name": "lambda", "trainable": true, "dtype": "float32", "function": {"class_name": "__tuple__", "items": ["4wEAAAAAAAAAAgAAAAQAAAATAAAAcxIAAAB0AGoBfACIAIgBgwN9AXwBUwApAU4pAtoWQ2hhcmFj\ndGVyTGV2ZWxDbm5Nb2RlbNoUX2NoYXJfZW5jb2RpbmdfbGF5ZXIpAtoJaW5wdXRfc3RyWg5jaGFy\nX2luX3ZlY3RvcikC2hRtYXhfY2hhcl9lbmNvZGluZ19pZNoKbWF4X2xlbmd0aKkA+lMvaG9tZS91\nYnVudHUvbmV3LWRwL0RhdGFQcm9maWxlci9kYXRhcHJvZmlsZXIvbGFiZWxlcnMvY2hhcmFjdGVy\nX2xldmVsX2Nubl9tb2RlbC5wedoRZW5jb2RpbmdfZnVuY3Rpb25TAgAAcwYAAAAAAQQBCgE=\n", null, {"class_name": "__tuple__", "items": [127, 3400]}]}, "function_type": "lambda", "module": "dataprofiler.labelers.character_level_cnn_model", "output_shape": {"class_name": "__tuple__", "items": [3400]}, "output_shape_type": "raw", "output_shape_module": null, "arguments": {}}, "inbound_nodes": [[["input_1", 0, 0, {}]]], "shared_object_id": 1}2 -‚root.layer_with_weights-0"_tf_keras_layer*Ë{"name": "embedding", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": {"class_name": "__tuple__", "items": [null, 3400]}, "stateful": false, "must_restore_from_config": false, "class_name": "Embedding", "config": {"name": "embedding", "trainable": true, "batch_input_shape": {"class_name": "__tuple__", "items": [null, 3400]}, "dtype": "float32", "input_dim": 129, "output_dim": 64, "embeddings_initializer": {"class_name": "RandomUniform", "config": {"minval": -0.05, "maxval": 0.05, "seed": null}, "shared_object_id": 2}, "embeddings_regularizer": null, "activity_regularizer": null, "embeddings_constraint": null, "mask_zero": false, "input_length": 3400}, "inbound_nodes": [[["lambda", 0, 0, {}]]], "shared_object_id": 3, "build_input_shape": {"class_name": "TensorShape", "items": [null, null]}}2 -ç root.layer_with_weights-1"_tf_keras_layer*° {"name": "conv1d", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Conv1D", "config": {"name": "conv1d", "trainable": true, "dtype": "float32", "filters": 48, "kernel_size": {"class_name": "__tuple__", "items": [13]}, "strides": {"class_name": "__tuple__", "items": [1]}, "padding": "same", "data_format": "channels_last", "dilation_rate": {"class_name": "__tuple__", "items": [1]}, "groups": 1, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 4}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 5}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["embedding", 0, 0, {}]]], "shared_object_id": 6, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 3, "axes": {"-1": 64}}, "shared_object_id": 56}, "build_input_shape": {"class_name": "TensorShape", "items": [null, null, 64]}}2 -¦ root.layer-4"_tf_keras_layer*ü{"name": "dropout", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dropout", "config": {"name": "dropout", "trainable": true, "dtype": "float32", "rate": 0.073, "noise_shape": null, "seed": null}, "inbound_nodes": [[["conv1d", 0, 0, {}]]], "shared_object_id": 7}2 -· root.layer_with_weights-2"_tf_keras_layer*€ {"name": "batch_normalization", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "BatchNormalization", "config": {"name": "batch_normalization", "trainable": true, "dtype": "float32", "axis": [2], "momentum": 0.99, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 8}, "gamma_initializer": {"class_name": "Ones", "config": {}, "shared_object_id": 9}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 10}, "moving_variance_initializer": {"class_name": "Ones", "config": {}, "shared_object_id": 11}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["dropout", 0, 0, {}]]], "shared_object_id": 12, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": 3, "max_ndim": null, "min_ndim": null, "axes": {"2": 48}}, "shared_object_id": 57}, "build_input_shape": {"class_name": "TensorShape", "items": [null, null, 48]}}2 -ø root.layer_with_weights-3"_tf_keras_layer*Á {"name": "conv1d_1", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Conv1D", "config": {"name": "conv1d_1", "trainable": true, "dtype": "float32", "filters": 48, "kernel_size": {"class_name": "__tuple__", "items": [13]}, "strides": {"class_name": "__tuple__", "items": [1]}, "padding": "same", "data_format": "channels_last", "dilation_rate": {"class_name": "__tuple__", "items": [1]}, "groups": 1, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 13}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 14}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["batch_normalization", 0, 0, {}]]], "shared_object_id": 15, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 3, "axes": {"-1": 48}}, "shared_object_id": 58}, "build_input_shape": {"class_name": "TensorShape", "items": [null, null, 48]}}2 -­ root.layer-7"_tf_keras_layer*ƒ{"name": "dropout_1", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dropout", "config": {"name": "dropout_1", "trainable": true, "dtype": "float32", "rate": 0.073, "noise_shape": null, "seed": null}, "inbound_nodes": [[["conv1d_1", 0, 0, {}]]], "shared_object_id": 16}2 -¿  root.layer_with_weights-4"_tf_keras_layer*ˆ {"name": "batch_normalization_1", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "BatchNormalization", "config": {"name": "batch_normalization_1", "trainable": true, "dtype": "float32", "axis": [2], "momentum": 0.99, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 17}, "gamma_initializer": {"class_name": "Ones", "config": {}, "shared_object_id": 18}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 19}, "moving_variance_initializer": {"class_name": "Ones", "config": {}, "shared_object_id": 20}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["dropout_1", 0, 0, {}]]], "shared_object_id": 21, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": 3, "max_ndim": null, "min_ndim": null, "axes": {"2": 48}}, "shared_object_id": 59}, "build_input_shape": {"class_name": "TensorShape", "items": [null, null, 48]}}2 -ú  -root.layer_with_weights-5"_tf_keras_layer*à {"name": "conv1d_2", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Conv1D", "config": {"name": "conv1d_2", "trainable": true, "dtype": "float32", "filters": 48, "kernel_size": {"class_name": "__tuple__", "items": [13]}, "strides": {"class_name": "__tuple__", "items": [1]}, "padding": "same", "data_format": "channels_last", "dilation_rate": {"class_name": "__tuple__", "items": [1]}, "groups": 1, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 22}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 23}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["batch_normalization_1", 0, 0, {}]]], "shared_object_id": 24, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 3, "axes": {"-1": 48}}, "shared_object_id": 60}, "build_input_shape": {"class_name": "TensorShape", "items": [null, null, 48]}}2 -®  root.layer-10"_tf_keras_layer*ƒ{"name": "dropout_2", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dropout", "config": {"name": "dropout_2", "trainable": true, "dtype": "float32", "rate": 0.073, "noise_shape": null, "seed": null}, "inbound_nodes": [[["conv1d_2", 0, 0, {}]]], "shared_object_id": 25}2 -¿  root.layer_with_weights-6"_tf_keras_layer*ˆ {"name": "batch_normalization_2", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "BatchNormalization", "config": {"name": "batch_normalization_2", "trainable": true, "dtype": "float32", "axis": [2], "momentum": 0.99, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 26}, "gamma_initializer": {"class_name": "Ones", "config": {}, "shared_object_id": 27}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 28}, "moving_variance_initializer": {"class_name": "Ones", "config": {}, "shared_object_id": 29}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["dropout_2", 0, 0, {}]]], "shared_object_id": 30, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": 3, "max_ndim": null, "min_ndim": null, "axes": {"2": 48}}, "shared_object_id": 61}, "build_input_shape": {"class_name": "TensorShape", "items": [null, null, 48]}}2 -ú  root.layer_with_weights-7"_tf_keras_layer*à {"name": "conv1d_3", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Conv1D", "config": {"name": "conv1d_3", "trainable": true, "dtype": "float32", "filters": 48, "kernel_size": {"class_name": "__tuple__", "items": [13]}, "strides": {"class_name": "__tuple__", "items": [1]}, "padding": "same", "data_format": "channels_last", "dilation_rate": {"class_name": "__tuple__", "items": [1]}, "groups": 1, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 31}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 32}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["batch_normalization_2", 0, 0, {}]]], "shared_object_id": 33, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 3, "axes": {"-1": 48}}, "shared_object_id": 62}, "build_input_shape": {"class_name": "TensorShape", "items": [null, null, 48]}}2 -® root.layer-13"_tf_keras_layer*ƒ{"name": "dropout_3", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dropout", "config": {"name": "dropout_3", "trainable": true, "dtype": "float32", "rate": 0.073, "noise_shape": null, "seed": null}, "inbound_nodes": [[["conv1d_3", 0, 0, {}]]], "shared_object_id": 34}2 -¿ root.layer_with_weights-8"_tf_keras_layer*ˆ {"name": "batch_normalization_3", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "BatchNormalization", "config": {"name": "batch_normalization_3", "trainable": true, "dtype": "float32", "axis": [2], "momentum": 0.99, "epsilon": 0.001, "center": true, "scale": true, "beta_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 35}, "gamma_initializer": {"class_name": "Ones", "config": {}, "shared_object_id": 36}, "moving_mean_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 37}, "moving_variance_initializer": {"class_name": "Ones", "config": {}, "shared_object_id": 38}, "beta_regularizer": null, "gamma_regularizer": null, "beta_constraint": null, "gamma_constraint": null}, "inbound_nodes": [[["dropout_3", 0, 0, {}]]], "shared_object_id": 39, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": 3, "max_ndim": null, "min_ndim": null, "axes": {"2": 48}}, "shared_object_id": 63}, "build_input_shape": {"class_name": "TensorShape", "items": [null, null, 48]}}2 -„root.layer_with_weights-9"_tf_keras_layer*Í{"name": "dense", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dense", "config": {"name": "dense", "trainable": true, "dtype": "float32", "units": 96, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 40}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 41}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["batch_normalization_3", 0, 0, {}]]], "shared_object_id": 42, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 2, "axes": {"-1": 48}}, "shared_object_id": 64}, "build_input_shape": {"class_name": "TensorShape", "items": [null, null, 48]}}2 -« root.layer-16"_tf_keras_layer*€{"name": "dropout_4", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dropout", "config": {"name": "dropout_4", "trainable": true, "dtype": "float32", "rate": 0.073, "noise_shape": null, "seed": null}, "inbound_nodes": [[["dense", 0, 0, {}]]], "shared_object_id": 43}2 -ýroot.layer_with_weights-10"_tf_keras_layer*Å{"name": "dense_1", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dense", "config": {"name": "dense_1", "trainable": true, "dtype": "float32", "units": 96, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 44}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 45}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["dropout_4", 0, 0, {}]]], "shared_object_id": 46, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 2, "axes": {"-1": 96}}, "shared_object_id": 65}, "build_input_shape": {"class_name": "TensorShape", "items": [null, null, 96]}}2 -­ root.layer-18"_tf_keras_layer*‚{"name": "dropout_5", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dropout", "config": {"name": "dropout_5", "trainable": true, "dtype": "float32", "rate": 0.073, "noise_shape": null, "seed": null}, "inbound_nodes": [[["dense_1", 0, 0, {}]]], "shared_object_id": 47}2 -€root.layer_with_weights-11"_tf_keras_layer*È{"name": "dense_2", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dense", "config": {"name": "dense_2", "trainable": true, "dtype": "float32", "units": 24, "activation": "softmax", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 48}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 49}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "inbound_nodes": [[["dropout_5", 0, 0, {}]]], "shared_object_id": 50, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 2, "axes": {"-1": 96}}, "shared_object_id": 66}, "build_input_shape": {"class_name": "TensorShape", "items": [null, null, 96]}}2 -í root.layer-20"_tf_keras_layer*Â{"name": "tf_op_layer_ArgMax", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": true, "class_name": "TensorFlowOpLayer", "config": {"name": "ArgMax", "trainable": true, "dtype": "float32", "node_def": {"name": "ArgMax", "op": "ArgMax", "input": ["dense_2/truediv", "ArgMax/dimension"], "attr": {"Tidx": {"type": "DT_INT32"}, "output_type": {"type": "DT_INT64"}, "T": {"type": "DT_FLOAT"}}}, "constants": {"1": -1}}, "inbound_nodes": [[["dense_2", 0, 0, {}]]], "shared_object_id": 51}2 -Æroot.layer_with_weights-12"_tf_keras_layer*Ž{"name": "thresh_arg_max_layer", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "ThreshArgMaxLayer", "config": {"layer was saved without config": true}}2 -º“root.keras_api.metrics.0"_tf_keras_metric*‚{"class_name": "Mean", "name": "loss", "dtype": "float32", "config": {"name": "loss", "dtype": "float32"}, "shared_object_id": 67}2 -Ê”root.keras_api.metrics.1"_tf_keras_metric*’{"class_name": "Mean", "name": "dense_2_loss", "dtype": "float32", "config": {"name": "dense_2_loss", "dtype": "float32"}, "shared_object_id": 68}2 -ã•root.keras_api.metrics.2"_tf_keras_metric*«{"class_name": "MeanMetricWrapper", "name": "acc", "dtype": "float32", "config": {"name": "acc", "dtype": "float32", "fn": "categorical_accuracy"}, "shared_object_id": 54}2 -––root.keras_api.metrics.3"_tf_keras_metric*Þ{"class_name": "Custom>F1Score", "name": "dense_2_f1_score", "dtype": "float32", "config": {"name": "dense_2_f1_score", "dtype": "float32", "num_classes": 24, "average": "micro", "threshold": null}, "shared_object_id": 55}2 \ No newline at end of file diff --git a/resources/labelers/unstructured_model/variables/variables.data-00000-of-00001 b/resources/labelers/unstructured_model/model.keras similarity index 88% rename from resources/labelers/unstructured_model/variables/variables.data-00000-of-00001 rename to resources/labelers/unstructured_model/model.keras index 95732bf16a505547c7a91a728e53951fa1f4d850..cbf03eada1c584ba135d59c2fd05031f06e9b75e 100644 GIT binary patch delta 32323 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 diff --git a/resources/labelers/unstructured_model/variables/variables.index b/resources/labelers/unstructured_model/variables/variables.index deleted file mode 100644 index 627e9a5776c6bef4df06e87785049587a60eab50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2660 zcmbW1ZAcVB7{}-CEZ1JRx?9CeW4G&SrI$TVH!FfV{NnkU3Jt|_q4lJi6Ew+ zHxx07vZ62u34(|sD2Ui1$qz+FekkmN^hQxc7?n{`vr}weqML1DcVXf8{O9@2vjf0n z#*yJ<93XRsTv!w?EGgSiygm{tC=JUS3f6`TBl4Q^P+1X^>;c@X&win=MLNCm#eR_I zZiX=>E-P)Ss6joZ*2cwvSlikj)x{;DNTj^Dpdu39BvyvXi%GT0P-#V&ao{qyahW7( zVCT#gEa%o+b)_W{VOWG`t~-Y=<*vohrVLpGP6^Vbj93h9%CJRv7P)i9dZi@})2V{tkcK*&XQ%R6czmNU!Q@TD+;lVW7r)0Tps^IGbGRvs<=Fsba5aa{ z`vv5Znnw2C2l=!9;vgp=(kzF;%cwSQ4t4ni)bErgE??_qc`vPlbPj#;3)Rxeduo0f zpKd1;qZe=&MG{;;uz+3Q4T^eW48|Mf4p{r|5isSab7Lg3ebt?s7S$UVQu?z{kH!3idVyQ~6o6$GCY`V0MBRP_IMEp7LZXz*n0K zfShCi@CyKSOZOG??Jyt4_?e5q;nF}4YkfO7K7&8ZGX1RE{Pgdu>MQD+*S==-C*`u& Af&c&j From 3467d62e165c432a75d0f4b4c94b50f4cd6c742f Mon Sep 17 00:00:00 2001 From: Jeremy Goodsitt Date: Wed, 5 Jun 2024 12:00:12 -0500 Subject: [PATCH 07/18] fix: manifest --- MANIFEST.in | 1 + 1 file changed, 1 insertion(+) diff --git a/MANIFEST.in b/MANIFEST.in index 12480abd8..0ace6ebe9 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,4 +1,5 @@ global-exclude .DS_Store +global-exclude */__pycache__/* include *.txt include CODEOWNERS From 15ac3959eda8ec2b9f09b1733f4cbd4af7a776e7 Mon Sep 17 00:00:00 2001 From: Jeremy Goodsitt Date: Wed, 5 Jun 2024 12:00:12 -0500 Subject: [PATCH 08/18] fix: bugs in compile and train --- .../labelers/character_level_cnn_model.py | 22 ++++++++++++++----- dataprofiler/labelers/labeler_utils.py | 5 ----- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/dataprofiler/labelers/character_level_cnn_model.py b/dataprofiler/labelers/character_level_cnn_model.py index 5a5c5a4c5..0c5519f66 100644 --- a/dataprofiler/labelers/character_level_cnn_model.py +++ b/dataprofiler/labelers/character_level_cnn_model.py @@ -573,14 +573,20 @@ def _construct_model(self) -> None: self._model = tf.keras.Model(self._model.inputs, argmax_outputs) # Compile the model - softmax_output_layer_name = self._model.outputs[0].name.split("/")[0] + softmax_output_layer_name = self._model.output_names[0] losses = {softmax_output_layer_name: "categorical_crossentropy"} # use f1 score metric f1_score_training = labeler_utils.F1Score( num_classes=num_labels, average="micro" ) - metrics = {softmax_output_layer_name: ["acc", f1_score_training]} + metrics = { + softmax_output_layer_name: [ + "categorical_crossentropy", + "acc", + f1_score_training, + ] + } self._model.compile(loss=losses, optimizer="adam", metrics=metrics) @@ -633,14 +639,20 @@ def _reconstruct_model(self) -> None: self._model = tf.keras.Model(self._model.inputs, argmax_outputs) # Compile the model - softmax_output_layer_name = self._model.outputs[0].name.split("/")[0] + softmax_output_layer_name = self._model.output_names[0] losses = {softmax_output_layer_name: "categorical_crossentropy"} # use f1 score metric f1_score_training = labeler_utils.F1Score( num_classes=num_labels, average="micro" ) - metrics = {softmax_output_layer_name: ["acc", f1_score_training]} + metrics = { + softmax_output_layer_name: [ + "categorical_crossentropy", + "acc", + f1_score_training, + ] + } self._model.compile(loss=losses, optimizer="adam", metrics=metrics) self._epoch_id = 0 @@ -692,7 +704,7 @@ def fit( f1_report: dict = {} self._model.reset_metrics() - softmax_output_layer_name = self._model.outputs[0].name.split("/")[0] + softmax_output_layer_name = self._model.output_names[0] start_time = time.time() batch_id = 0 diff --git a/dataprofiler/labelers/labeler_utils.py b/dataprofiler/labelers/labeler_utils.py index 00bae98dc..3a24886f3 100644 --- a/dataprofiler/labelers/labeler_utils.py +++ b/dataprofiler/labelers/labeler_utils.py @@ -435,11 +435,6 @@ def get_config(self) -> dict: base_config = super().get_config() return {**base_config, **config} - def reset_state(self) -> None: - """Reset state.""" - reset_value = tf.zeros(self.init_shape, dtype=self.dtype) - tf.keras.backend.batch_set_value([(v, reset_value) for v in self.variables]) - @protected_register_keras_serializable() class F1Score(FBetaScore): From cd32b7c0cbf4a0144051581b59ffe389c528c483 Mon Sep 17 00:00:00 2001 From: Jeremy Goodsitt Date: Wed, 5 Jun 2024 12:00:12 -0500 Subject: [PATCH 09/18] fix: bug in load_from_library --- dataprofiler/labelers/data_labelers.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dataprofiler/labelers/data_labelers.py b/dataprofiler/labelers/data_labelers.py index 7172e7472..27550201c 100644 --- a/dataprofiler/labelers/data_labelers.py +++ b/dataprofiler/labelers/data_labelers.py @@ -141,11 +141,11 @@ def load_from_library(cls, name: str, trainable: bool = False) -> BaseDataLabele :type trainable: bool :return: DataLabeler class """ - if trainable: - return TrainableDataLabeler.load_from_library(name) for _, labeler_class_obj in cls.labeler_classes.items(): if name in labeler_class_obj._default_model_loc: - return labeler_class_obj() + name = labeler_class_obj._default_model_loc + if trainable: + return TrainableDataLabeler.load_from_library(name) return BaseDataLabeler.load_from_library(name) @classmethod From d5667d79bd929ba4c5fde1a832d1e4438d64611e Mon Sep 17 00:00:00 2001 From: Jeremy Goodsitt Date: Wed, 5 Jun 2024 12:00:12 -0500 Subject: [PATCH 10/18] fix: bugs in CharCNN --- dataprofiler/labelers/character_level_cnn_model.py | 10 +++------- .../tests/labelers/test_char_tf_load_model.py | 2 +- .../tests/labelers/test_character_level_cnn_model.py | 12 +++++------- 3 files changed, 9 insertions(+), 15 deletions(-) diff --git a/dataprofiler/labelers/character_level_cnn_model.py b/dataprofiler/labelers/character_level_cnn_model.py index 0c5519f66..e4d3430d6 100644 --- a/dataprofiler/labelers/character_level_cnn_model.py +++ b/dataprofiler/labelers/character_level_cnn_model.py @@ -614,15 +614,11 @@ def _reconstruct_model(self) -> None: num_labels = self.num_labels default_ind = self.label_mapping[self._parameters["default_label"]] - # Remove the 3 output layers (dense_2', 'tf_op_layer_ArgMax', - # 'thresh_arg_max_layer') - for _ in range(3): - self._model.layers.pop() - # Add the final Softmax layer to the previous spot + # self._model.layers[-3] to skip: thresh and original softmax final_softmax_layer = tf.keras.layers.Dense( num_labels, activation="softmax", name="dense_2" - )(self._model.layers[-4].output) + )(self._model.layers[-3].output) # Output the model into a .pb file for TensorFlow argmax_layer = tf.keras.ops.argmax(final_softmax_layer, axis=2) @@ -785,7 +781,7 @@ def _validate_training( for x_val, y_val in val_data: y_val_pred.append( self._model.predict( - x_val, batch_size=batch_size_test, verbose=verbose_keras + tf.convert_to_tensor(x_val), batch_size=batch_size_test, verbose=verbose_keras )[1] ) y_val_test.append(np.argmax(y_val, axis=-1)) diff --git a/dataprofiler/tests/labelers/test_char_tf_load_model.py b/dataprofiler/tests/labelers/test_char_tf_load_model.py index fbfde0c49..c6d70f740 100644 --- a/dataprofiler/tests/labelers/test_char_tf_load_model.py +++ b/dataprofiler/tests/labelers/test_char_tf_load_model.py @@ -272,7 +272,7 @@ def test_fit_and_predict(self, *mocks): ) # predict after fitting on just the text - model.predict(data_gen[0][0]) + model.predict([data_gen[0][0]]) @mock.patch("os.makedirs", return_value=None) def test_validation_evaluate_and_classification_report(self, *mocks): diff --git a/dataprofiler/tests/labelers/test_character_level_cnn_model.py b/dataprofiler/tests/labelers/test_character_level_cnn_model.py index ad549cc53..5ab719d37 100644 --- a/dataprofiler/tests/labelers/test_character_level_cnn_model.py +++ b/dataprofiler/tests/labelers/test_character_level_cnn_model.py @@ -9,7 +9,7 @@ import pkg_resources import tensorflow as tf -from dataprofiler.labelers.character_level_cnn_model import CharacterLevelCnnModel +from dataprofiler.labelers.character_level_cnn_model import CharacterLevelCnnModel, EncodingLayer _file_dir = os.path.dirname(os.path.abspath(__file__)) _resource_labeler_dir = pkg_resources.resource_filename("resources", "labelers") @@ -272,7 +272,7 @@ def test_fit_and_predict_with_new_labels(self): ) # predict after fitting on just the text - cnn_model.predict(data_gen[0][0]) + cnn_model.predict([data_gen[0][0]]) def test_fit_and_predict_with_new_labels_set_via_method(self): # Initialize model @@ -301,7 +301,7 @@ def test_fit_and_predict_with_new_labels_set_via_method(self): history, f1, f1_report = cnn_model.fit(data_gen, cv_gen) # test predict on just the text - cnn_model.predict(data_gen[0][0]) + cnn_model.predict([data_gen[0][0]]) def test_validation(self): @@ -368,9 +368,8 @@ def test_input_encoding(self): max_char_encoding_id = 127 max_len = 10 - encode_output = cnn_model._char_encoding_layer( - input_str_tensor, max_char_encoding_id, max_len - ).numpy()[0] + encode_layer = EncodingLayer(max_char_encoding_id, max_len) + encode_output = encode_layer.call(input_str_tensor).numpy()[0] expected_output = [117, 102, 116, 117, 0, 0, 0, 0, 0, 0] self.assertCountEqual(encode_output, expected_output) @@ -464,7 +463,6 @@ def test_model_construct(self): "dense_1", "dropout_5", "dense_2", - "tf_op_layer_ArgMax", "thresh_arg_max_layer", ] model_layers = [layer.name for layer in cnn_model._model.layers] From 799cfe4427604d642c5f89d9bf3830ef24a3a76a Mon Sep 17 00:00:00 2001 From: Jeremy Goodsitt Date: Wed, 5 Jun 2024 12:00:12 -0500 Subject: [PATCH 11/18] refactor: loading tf model labeler --- dataprofiler/labelers/char_load_tf_model.py | 26 ++++++++++----------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/dataprofiler/labelers/char_load_tf_model.py b/dataprofiler/labelers/char_load_tf_model.py index b168e9234..985d16581 100644 --- a/dataprofiler/labelers/char_load_tf_model.py +++ b/dataprofiler/labelers/char_load_tf_model.py @@ -237,7 +237,8 @@ def _construct_model(self) -> None: model_loc = self._parameters["model_path"] self._model: tf.keras.Model = tf.keras.models.load_model(model_loc) - softmax_output_layer_name = self._model.outputs[0].name.split("/")[0] + self._model = tf.keras.Model(self._model.inputs, self._model.outputs) + softmax_output_layer_name = self._model.output_names[0] softmax_layer_ind = cast( int, labeler_utils.get_tf_layer_index_from_name( @@ -253,20 +254,21 @@ def _construct_model(self) -> None: )(self._model.layers[softmax_layer_ind - 1].output) # Output the model into a .pb file for TensorFlow - argmax_layer = tf.keras.backend.argmax(new_softmax_layer) + argmax_layer = tf.keras.ops.argmax(new_softmax_layer, axis=2) argmax_outputs = [new_softmax_layer, argmax_layer] self._model = tf.keras.Model(self._model.inputs, argmax_outputs) + self._model = tf.keras.Model(self._model.inputs, self._model.outputs) # Compile the model w/ metrics - softmax_output_layer_name = self._model.outputs[0].name.split("/")[0] + softmax_output_layer_name = self._model.output_names[0] losses = {softmax_output_layer_name: "categorical_crossentropy"} # use f1 score metric f1_score_training = labeler_utils.F1Score( num_classes=num_labels, average="micro" ) - metrics = {softmax_output_layer_name: ["acc", f1_score_training]} + metrics = {softmax_output_layer_name: ["categorical_crossentropy", "acc", f1_score_training]} self._model.compile(loss=losses, optimizer="adam", metrics=metrics) @@ -294,30 +296,28 @@ def _reconstruct_model(self) -> None: num_labels = self.num_labels default_ind = self.label_mapping[self._parameters["default_label"]] - # Remove the 2 output layers ('softmax', 'tf_op_layer_ArgMax') - for _ in range(2): - self._model.layers.pop() - # Add the final Softmax layer to the previous spot + # self._model.layers[-2] to skip: original softmax final_softmax_layer = tf.keras.layers.Dense( num_labels, activation="softmax", name="softmax_output" - )(self._model.layers[-4].output) + )(self._model.layers[-2].output) # Output the model into a .pb file for TensorFlow - argmax_layer = tf.keras.backend.argmax(final_softmax_layer) + # argmax_layer = tf.keras.backend.argmax(final_softmax_layer) + argmax_layer = tf.keras.ops.argmax(final_softmax_layer, axis=2) argmax_outputs = [final_softmax_layer, argmax_layer] self._model = tf.keras.Model(self._model.inputs, argmax_outputs) # Compile the model - softmax_output_layer_name = self._model.outputs[0].name.split("/")[0] + softmax_output_layer_name = self._model.output_names[0] losses = {softmax_output_layer_name: "categorical_crossentropy"} # use f1 score metric f1_score_training = labeler_utils.F1Score( num_classes=num_labels, average="micro" ) - metrics = {softmax_output_layer_name: ["acc", f1_score_training]} + metrics = {softmax_output_layer_name: ["categorical_crossentropy", "acc", f1_score_training]} self._model.compile(loss=losses, optimizer="adam", metrics=metrics) @@ -370,7 +370,7 @@ def fit( f1_report: dict = {} self._model.reset_metrics() - softmax_output_layer_name = self._model.outputs[0].name.split("/")[0] + softmax_output_layer_name = self._model.output_names[0] start_time = time.time() batch_id = 0 From 5db51182bc184633402279a8ef370d66e8f936d1 Mon Sep 17 00:00:00 2001 From: Jeremy Goodsitt Date: Wed, 5 Jun 2024 12:00:12 -0500 Subject: [PATCH 12/18] fix: bug in data_labeler identification --- dataprofiler/labelers/data_labelers.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dataprofiler/labelers/data_labelers.py b/dataprofiler/labelers/data_labelers.py index 27550201c..a6d9932b7 100644 --- a/dataprofiler/labelers/data_labelers.py +++ b/dataprofiler/labelers/data_labelers.py @@ -141,8 +141,8 @@ def load_from_library(cls, name: str, trainable: bool = False) -> BaseDataLabele :type trainable: bool :return: DataLabeler class """ - for _, labeler_class_obj in cls.labeler_classes.items(): - if name in labeler_class_obj._default_model_loc: + for labeler_name, labeler_class_obj in cls.labeler_classes.items(): + if name == labeler_name: name = labeler_class_obj._default_model_loc if trainable: return TrainableDataLabeler.load_from_library(name) From b1edcecbb166e23b506cb598a6f6ac6c4b0b707b Mon Sep 17 00:00:00 2001 From: Jeremy Goodsitt Date: Wed, 5 Jun 2024 12:00:12 -0500 Subject: [PATCH 13/18] fix: update model to use proper softmax layer names --- .../labelers/structured_model/model.keras | Bin 694678 -> 694688 bytes .../labelers/unstructured_model/model.keras | Bin 694678 -> 694688 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/resources/labelers/structured_model/model.keras b/resources/labelers/structured_model/model.keras index cbf03eada1c584ba135d59c2fd05031f06e9b75e..795d637da084c50f855834c4acf639ee783b2bc6 100644 GIT binary patch delta 210 zcmbQXS!=;&EujE!W)=|!2vB5bJNz_nqL7cWp@V^;m7%GXp^;K8s*3O38+eqR7#Nf{ zHr6<>r=;c;r^Xvi=5=)DhO(8c6rv{!I7+eWC@3W+Co4_<#i+8m*HM#^`5EWx=ABOM zJDnJTmA5qxl-X{~-~##p0D$;F#Q*>R delta 212 zcmZ3mS!>#6EujE!W)=|!2vB5r_3Z2Xi9$Zg1`dYCRt82^MutkYs46bJ3YCy_VqlQm z*jVErkeynTSR7xHnpd1(6mMv0Fqy^CSp;2B$x0!5bDm=mBePe=s^-H^?T4KhftU%1 znSq!Eh*^P{4T#x+m;;D8w;y)mQVnAPxo7&D8C>R^aC@ig%;eGmnKV6mCYLnhn(5^; Nxs=(?&ENw10RVx1M0x-K diff --git a/resources/labelers/unstructured_model/model.keras b/resources/labelers/unstructured_model/model.keras index cbf03eada1c584ba135d59c2fd05031f06e9b75e..795d637da084c50f855834c4acf639ee783b2bc6 100644 GIT binary patch delta 210 zcmbQXS!=;&EujE!W)=|!2vB5bJNz_nqL7cWp@V^;m7%GXp^;K8s*3O38+eqR7#Nf{ zHr6<>r=;c;r^Xvi=5=)DhO(8c6rv{!I7+eWC@3W+Co4_<#i+8m*HM#^`5EWx=ABOM zJDnJTmA5qxl-X{~-~##p0D$;F#Q*>R delta 212 zcmZ3mS!>#6EujE!W)=|!2vB5r_3Z2Xi9$Zg1`dYCRt82^MutkYs46bJ3YCy_VqlQm z*jVErkeynTSR7xHnpd1(6mMv0Fqy^CSp;2B$x0!5bDm=mBePe=s^-H^?T4KhftU%1 znSq!Eh*^P{4T#x+m;;D8w;y)mQVnAPxo7&D8C>R^aC@ig%;eGmnKV6mCYLnhn(5^; Nxs=(?&ENw10RVx1M0x-K From a88593a0c0f5eed99946bd3a5b7dfa33a87a05b3 Mon Sep 17 00:00:00 2001 From: Jeremy Goodsitt Date: Wed, 5 Jun 2024 12:00:12 -0500 Subject: [PATCH 14/18] fix: formatting --- dataprofiler/labelers/char_load_tf_model.py | 16 ++++++++++++++-- .../labelers/character_level_cnn_model.py | 4 +++- .../labelers/test_character_level_cnn_model.py | 5 ++++- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/dataprofiler/labelers/char_load_tf_model.py b/dataprofiler/labelers/char_load_tf_model.py index 985d16581..fd9a55494 100644 --- a/dataprofiler/labelers/char_load_tf_model.py +++ b/dataprofiler/labelers/char_load_tf_model.py @@ -268,7 +268,13 @@ def _construct_model(self) -> None: f1_score_training = labeler_utils.F1Score( num_classes=num_labels, average="micro" ) - metrics = {softmax_output_layer_name: ["categorical_crossentropy", "acc", f1_score_training]} + metrics = { + softmax_output_layer_name: [ + "categorical_crossentropy", + "acc", + f1_score_training, + ] + } self._model.compile(loss=losses, optimizer="adam", metrics=metrics) @@ -317,7 +323,13 @@ def _reconstruct_model(self) -> None: f1_score_training = labeler_utils.F1Score( num_classes=num_labels, average="micro" ) - metrics = {softmax_output_layer_name: ["categorical_crossentropy", "acc", f1_score_training]} + metrics = { + softmax_output_layer_name: [ + "categorical_crossentropy", + "acc", + f1_score_training, + ] + } self._model.compile(loss=losses, optimizer="adam", metrics=metrics) diff --git a/dataprofiler/labelers/character_level_cnn_model.py b/dataprofiler/labelers/character_level_cnn_model.py index e4d3430d6..739c6c8af 100644 --- a/dataprofiler/labelers/character_level_cnn_model.py +++ b/dataprofiler/labelers/character_level_cnn_model.py @@ -781,7 +781,9 @@ def _validate_training( for x_val, y_val in val_data: y_val_pred.append( self._model.predict( - tf.convert_to_tensor(x_val), batch_size=batch_size_test, verbose=verbose_keras + tf.convert_to_tensor(x_val), + batch_size=batch_size_test, + verbose=verbose_keras, )[1] ) y_val_test.append(np.argmax(y_val, axis=-1)) diff --git a/dataprofiler/tests/labelers/test_character_level_cnn_model.py b/dataprofiler/tests/labelers/test_character_level_cnn_model.py index 5ab719d37..e120a9754 100644 --- a/dataprofiler/tests/labelers/test_character_level_cnn_model.py +++ b/dataprofiler/tests/labelers/test_character_level_cnn_model.py @@ -9,7 +9,10 @@ import pkg_resources import tensorflow as tf -from dataprofiler.labelers.character_level_cnn_model import CharacterLevelCnnModel, EncodingLayer +from dataprofiler.labelers.character_level_cnn_model import ( + CharacterLevelCnnModel, + EncodingLayer, +) _file_dir = os.path.dirname(os.path.abspath(__file__)) _resource_labeler_dir = pkg_resources.resource_filename("resources", "labelers") From 5916460d3b8c3c93e5740792a6edb577a4045f63 Mon Sep 17 00:00:00 2001 From: Jeremy Goodsitt Date: Wed, 5 Jun 2024 12:00:12 -0500 Subject: [PATCH 15/18] fix: remove unused line --- dataprofiler/labelers/char_load_tf_model.py | 1 - 1 file changed, 1 deletion(-) diff --git a/dataprofiler/labelers/char_load_tf_model.py b/dataprofiler/labelers/char_load_tf_model.py index fd9a55494..f921ac962 100644 --- a/dataprofiler/labelers/char_load_tf_model.py +++ b/dataprofiler/labelers/char_load_tf_model.py @@ -309,7 +309,6 @@ def _reconstruct_model(self) -> None: )(self._model.layers[-2].output) # Output the model into a .pb file for TensorFlow - # argmax_layer = tf.keras.backend.argmax(final_softmax_layer) argmax_layer = tf.keras.ops.argmax(final_softmax_layer, axis=2) argmax_outputs = [final_softmax_layer, argmax_layer] From 30c8207e614e5a80fdfd7922dbb887ff339bb780 Mon Sep 17 00:00:00 2001 From: Jeremy Goodsitt Date: Wed, 5 Jun 2024 12:00:12 -0500 Subject: [PATCH 16/18] refactor: drop support for 3.8 --- .github/workflows/test-python-package.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-python-package.yml b/.github/workflows/test-python-package.yml index fa84b3d3a..a4db18633 100644 --- a/.github/workflows/test-python-package.yml +++ b/.github/workflows/test-python-package.yml @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: [3.8, 3.9, "3.10"] + python-version: [3.9, "3.10"] steps: - uses: actions/checkout@v4 From 062355ea49a1b32aeaeb2a563fe216f6c0753656 Mon Sep 17 00:00:00 2001 From: Jeremy Goodsitt Date: Wed, 5 Jun 2024 12:00:12 -0500 Subject: [PATCH 17/18] fix: comments --- dataprofiler/labelers/char_load_tf_model.py | 4 ++-- dataprofiler/labelers/character_level_cnn_model.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dataprofiler/labelers/char_load_tf_model.py b/dataprofiler/labelers/char_load_tf_model.py index f921ac962..a4a44e03a 100644 --- a/dataprofiler/labelers/char_load_tf_model.py +++ b/dataprofiler/labelers/char_load_tf_model.py @@ -253,7 +253,7 @@ def _construct_model(self) -> None: num_labels, activation="softmax", name="softmax_output" )(self._model.layers[softmax_layer_ind - 1].output) - # Output the model into a .pb file for TensorFlow + # Add argmax layer to get labels directly as an output argmax_layer = tf.keras.ops.argmax(new_softmax_layer, axis=2) argmax_outputs = [new_softmax_layer, argmax_layer] @@ -308,7 +308,7 @@ def _reconstruct_model(self) -> None: num_labels, activation="softmax", name="softmax_output" )(self._model.layers[-2].output) - # Output the model into a .pb file for TensorFlow + # Add argmax layer to get labels directly as an output argmax_layer = tf.keras.ops.argmax(final_softmax_layer, axis=2) argmax_outputs = [final_softmax_layer, argmax_layer] diff --git a/dataprofiler/labelers/character_level_cnn_model.py b/dataprofiler/labelers/character_level_cnn_model.py index 739c6c8af..01b7572f2 100644 --- a/dataprofiler/labelers/character_level_cnn_model.py +++ b/dataprofiler/labelers/character_level_cnn_model.py @@ -558,7 +558,7 @@ def _construct_model(self) -> None: # Add the final Softmax layer self._model.add(tf.keras.layers.Dense(num_labels, activation="softmax")) - # Output the model into a .pb file for TensorFlow + # Add argmax layer to get labels directly as an output argmax_layer = tf.keras.ops.argmax(self._model.outputs[0], axis=2) # Create confidence layers @@ -620,7 +620,7 @@ def _reconstruct_model(self) -> None: num_labels, activation="softmax", name="dense_2" )(self._model.layers[-3].output) - # Output the model into a .pb file for TensorFlow + # Add argmax layer to get labels directly as an output argmax_layer = tf.keras.ops.argmax(final_softmax_layer, axis=2) # Create confidence layers From 4adc8e09932ecb2ba9f9363bc23c8e68e5e8411f Mon Sep 17 00:00:00 2001 From: Jeremy Goodsitt Date: Wed, 5 Jun 2024 12:00:12 -0500 Subject: [PATCH 18/18] fix: comment --- dataprofiler/labelers/character_level_cnn_model.py | 1 - 1 file changed, 1 deletion(-) diff --git a/dataprofiler/labelers/character_level_cnn_model.py b/dataprofiler/labelers/character_level_cnn_model.py index 01b7572f2..2cbb7051a 100644 --- a/dataprofiler/labelers/character_level_cnn_model.py +++ b/dataprofiler/labelers/character_level_cnn_model.py @@ -546,7 +546,6 @@ def _construct_model(self) -> None: ) if self._parameters["dropout"]: self._model.add(tf.keras.layers.Dropout(self._parameters["dropout"])) - # Add batch normalization, set fused = True for compactness self._model.add(tf.keras.layers.BatchNormalization(scale=True)) # Add the fully connected layers