From f3969a8df1ed38809cda80d8f0186fcf4fde9b63 Mon Sep 17 00:00:00 2001 From: Katherine Wu Date: Tue, 22 Oct 2019 13:27:33 -0700 Subject: [PATCH] Remove experimental keras SavedModel symbol from V2. Users should use model.save(path, save_format='tf') instead. PiperOrigin-RevId: 276131264 Change-Id: If01f787860a117d6de8f96533cfa8b9a7a128a53 --- .../keras/saving/saved_model_experimental.py | 4 ++-- .../v2/tensorflow.keras.experimental.pbtxt | 8 -------- .../tools/compatibility/all_renames_v2.py | 4 ++-- tensorflow/tools/compatibility/renames_v2.py | 4 ++++ .../tools/compatibility/tf_upgrade_v2.py | 16 ++++++++++++++++ .../tools/compatibility/tf_upgrade_v2_test.py | 18 +++++++++++++++--- 6 files changed, 39 insertions(+), 15 deletions(-) diff --git a/tensorflow/python/keras/saving/saved_model_experimental.py b/tensorflow/python/keras/saving/saved_model_experimental.py index 01aa2cb2f5f..a4cce315fda 100644 --- a/tensorflow/python/keras/saving/saved_model_experimental.py +++ b/tensorflow/python/keras/saving/saved_model_experimental.py @@ -64,7 +64,7 @@ sequential = LazyLoader( date=None, instructions=('Please use `model.save(..., save_format="tf")` or ' '`tf.keras.models.save_model(..., save_format="tf")`.')) -@keras_export('keras.experimental.export_saved_model') +@keras_export(v1=['keras.experimental.export_saved_model']) def export_saved_model(model, saved_model_path, custom_objects=None, @@ -374,7 +374,7 @@ def _assert_same_non_optimizer_objects(model, model_graph, clone, clone_graph): date=None, instructions=('The experimental save and load functions have been ' 'deprecated. Please switch to `tf.keras.models.load_model`.')) -@keras_export('keras.experimental.load_from_saved_model') +@keras_export(v1=['keras.experimental.load_from_saved_model']) def load_from_saved_model(saved_model_path, custom_objects=None): """Loads a keras Model from a SavedModel created by `export_saved_model()`. diff --git a/tensorflow/tools/api/golden/v2/tensorflow.keras.experimental.pbtxt b/tensorflow/tools/api/golden/v2/tensorflow.keras.experimental.pbtxt index 4a83b58df83..655018a30c4 100644 --- a/tensorflow/tools/api/golden/v2/tensorflow.keras.experimental.pbtxt +++ b/tensorflow/tools/api/golden/v2/tensorflow.keras.experimental.pbtxt @@ -32,14 +32,6 @@ tf_module { name: "WideDeepModel" mtype: "" } - member_method { - name: "export_saved_model" - argspec: "args=[\'model\', \'saved_model_path\', \'custom_objects\', \'as_text\', \'input_signature\', \'serving_only\'], varargs=None, keywords=None, defaults=[\'None\', \'False\', \'None\', \'False\'], " - } - member_method { - name: "load_from_saved_model" - argspec: "args=[\'saved_model_path\', \'custom_objects\'], varargs=None, keywords=None, defaults=[\'None\'], " - } member_method { name: "terminate_keras_multiprocessing_pools" argspec: "args=[\'grace_period\', \'use_sigkill\'], varargs=None, keywords=None, defaults=[\'0.1\', \'False\'], " diff --git a/tensorflow/tools/compatibility/all_renames_v2.py b/tensorflow/tools/compatibility/all_renames_v2.py index 67c117a7c3c..0093eafbf08 100644 --- a/tensorflow/tools/compatibility/all_renames_v2.py +++ b/tensorflow/tools/compatibility/all_renames_v2.py @@ -192,9 +192,9 @@ manual_symbol_renames = { "tf.contrib.util.constant_value": "tf.get_static_value", "tf.contrib.saved_model.load_keras_model": - "tf.keras.experimental.load_from_saved_model", + "tf.compat.v1.keras.experimental.load_from_saved_model", "tf.contrib.saved_model.save_keras_model": - "tf.keras.experimental.export_saved_model", + "tf.compat.v1.keras.experimental.export_saved_model", "tf.contrib.rnn.RNNCell": "tf.compat.v1.nn.rnn_cell.RNNCell", "tf.contrib.rnn.LSTMStateTuple": diff --git a/tensorflow/tools/compatibility/renames_v2.py b/tensorflow/tools/compatibility/renames_v2.py index 93dc3e899d6..1ab6bfe924b 100644 --- a/tensorflow/tools/compatibility/renames_v2.py +++ b/tensorflow/tools/compatibility/renames_v2.py @@ -514,6 +514,10 @@ renames = { 'tf.compat.v1.keras.backend.get_session', 'tf.keras.backend.set_session': 'tf.compat.v1.keras.backend.set_session', + 'tf.keras.experimental.export_saved_model': + 'tf.compat.v1.keras.experimental.export_saved_model', + 'tf.keras.experimental.load_from_saved_model': + 'tf.compat.v1.keras.experimental.load_from_saved_model', 'tf.keras.layers.CuDNNGRU': 'tf.compat.v1.keras.layers.CuDNNGRU', 'tf.keras.layers.CuDNNLSTM': diff --git a/tensorflow/tools/compatibility/tf_upgrade_v2.py b/tensorflow/tools/compatibility/tf_upgrade_v2.py index 2bd5bb984c8..ee26d23e736 100644 --- a/tensorflow/tools/compatibility/tf_upgrade_v2.py +++ b/tensorflow/tools/compatibility/tf_upgrade_v2.py @@ -862,6 +862,14 @@ class TFAPIChangeSpec(ast_edits.NoUpdateSpec): " and tf.distribute.experimental.CentralStorageStrategy (one machine). " "Note the changes in constructors. " + distribute_strategy_api_changes) + keras_experimental_export_comment = ( + ast_edits.WARNING, + "tf.keras.experimental.export_saved_model and " + "tf.keras.experimental.load_from_saved_model have been deprecated." + "Please use model.save(path, save_format='tf') " + "(or alternatively tf.keras.models.save_model), and " + "tf.keras.models.load_model(path) instead.") + # Function warnings. placeholder inside warnings will be # replaced by function name. # You can use *. to add items which do not check the FQN, and apply to e.g., @@ -921,6 +929,10 @@ class TFAPIChangeSpec(ast_edits.NoUpdateSpec): contrib_estimator_head_comment, "tf.contrib.estimator.regression_head": contrib_estimator_head_comment, + "tf.contrib.saved_model.load_keras_model": + keras_experimental_export_comment, + "tf.contrib.saved_model.save_keras_model": + keras_experimental_export_comment, "tf.contrib.summary.all_summary_ops": contrib_summary_comment, "tf.contrib.summary.audio": @@ -1009,6 +1021,10 @@ class TFAPIChangeSpec(ast_edits.NoUpdateSpec): "checkpoints (format used by `keras_model.save_weights` and " "`keras_model.load_weights`) by default in 2.0. To continue " "saving name-based checkpoints, set `checkpoint_format='saver'`."), + "tf.keras.experimental.export_saved_model": + keras_experimental_export_comment, + "tf.keras.experimental.load_from_saved_model": + keras_experimental_export_comment, "tf.keras.initializers.Zeros": initializers_no_dtype_comment, "tf.keras.initializers.zeros": diff --git a/tensorflow/tools/compatibility/tf_upgrade_v2_test.py b/tensorflow/tools/compatibility/tf_upgrade_v2_test.py index dbd35ccc0bf..0c828d5fed6 100644 --- a/tensorflow/tools/compatibility/tf_upgrade_v2_test.py +++ b/tensorflow/tools/compatibility/tf_upgrade_v2_test.py @@ -1206,10 +1206,14 @@ bazel-bin/tensorflow/tools/compatibility/update/generate_v2_reorders_map "tf.contrib.saved_model.save_keras_model(model, './saved_models')\n" "tf.contrib.saved_model.load_keras_model(saved_model_path)\n") expected_text = ( - "tf.keras.experimental.export_saved_model(model, './saved_models')\n" - "tf.keras.experimental.load_from_saved_model(saved_model_path)\n") - _, unused_report, unused_errors, new_text = self._upgrade(text) + "tf.compat.v1.keras.experimental.export_saved_model(model, " + "'./saved_models')\ntf.compat.v1.keras.experimental." + "load_from_saved_model(saved_model_path)\n" + ) + _, report, unused_errors, new_text = self._upgrade(text) self.assertEqual(new_text, expected_text) + expected_info = "Please use model.save" + self.assertIn(expected_info, report) def testStatelessMultinomial(self): text = ( @@ -2256,12 +2260,20 @@ def _log_prob(self, x): result_a, result_b = results[0], results[1] self.assertEqual(result_a[3], expected_text_a) self.assertEqual(result_b[3], expected_text_b) + def test_model_to_estimator_checkpoint_warning(self): text = "tf.keras.estimator.model_to_estimator(model)" _, report, _, _ = self._upgrade(text) expected_info = "will save object-based checkpoints" self.assertIn(expected_info, report) + def test_keras_experimental_export_warning(self): + text = "tf.keras.experimental.export_saved_model" + _, report, _, _ = self._upgrade(text) + expected_info = "Please use model.save" + self.assertIn(expected_info, report) + + class TestUpgradeFiles(test_util.TensorFlowTestCase): def testInplace(self):