From f38aedf946f3132166bc52cb3e4417847837b60e Mon Sep 17 00:00:00 2001 From: Ping Yu <4018+pyu10055@users.noreply.github.com> Date: Mon, 30 Dec 2019 15:11:51 -0800 Subject: [PATCH 1/8] update the tensorflow deps to 2.0.0 --- tfjs-converter/python/requirements.txt | 2 +- .../tensorflowjs/converters/converter.py | 2 +- .../tensorflowjs/converters/converter_test.py | 2 +- .../converters/fold_batch_norms_test.py | 25 +++++++++--------- .../converters/fuse_depthwise_conv2d_test.py | 2 +- .../converters/fuse_prelu_test.py | 2 +- .../converters/generate_test_model.py | 2 +- .../converters/keras_h5_conversion_test.py | 4 +-- .../converters/keras_tfjs_loader.py | 2 +- .../converters/keras_tfjs_loader_test.py | 2 +- .../tf_saved_model_conversion_v2_test.py | 26 +++++++++---------- .../python/tensorflowjs/converters/wizard.py | 2 +- .../tensorflowjs/converters/wizard_test.py | 2 +- .../python/test_nightly_pip_package.py | 2 +- tfjs-converter/python/test_pip_package.py | 13 +++++----- 15 files changed, 46 insertions(+), 44 deletions(-) diff --git a/tfjs-converter/python/requirements.txt b/tfjs-converter/python/requirements.txt index 3a6e6c2efab..a83b65c2bc4 100644 --- a/tfjs-converter/python/requirements.txt +++ b/tfjs-converter/python/requirements.txt @@ -1,7 +1,7 @@ h5py==2.8.0 numpy==1.16.4 six==1.11.0 -tensorflow==1.15.0 +tensorflow==2.0.0 tensorflow-hub==0.5.0 gast==0.2.2 PyInquirer==1.0.3 diff --git a/tfjs-converter/python/tensorflowjs/converters/converter.py b/tfjs-converter/python/tensorflowjs/converters/converter.py index 36627410c8f..4be3a02fd07 100644 --- a/tfjs-converter/python/tensorflowjs/converters/converter.py +++ b/tfjs-converter/python/tensorflowjs/converters/converter.py @@ -168,7 +168,7 @@ def dispatch_keras_saved_model_to_tensorflowjs_conversion( (Default: `False`). """ with tf.Graph().as_default(), tf.compat.v1.Session(): - model = keras.experimental.load_from_saved_model(keras_saved_model_path) + model = tf.keras.modelexperimental.load_from_saved_model(keras_saved_model_path) # Save model temporarily in HDF5 format. temp_h5_path = tempfile.mktemp(suffix='.h5') diff --git a/tfjs-converter/python/tensorflowjs/converters/converter_test.py b/tfjs-converter/python/tensorflowjs/converters/converter_test.py index 70499609ab6..71154a9aea0 100644 --- a/tfjs-converter/python/tensorflowjs/converters/converter_test.py +++ b/tfjs-converter/python/tensorflowjs/converters/converter_test.py @@ -26,7 +26,7 @@ import unittest import numpy as np -import tensorflow as tf +import tensorflow.compat.v2 as tf from tensorflow import keras from tensorflowjs import version diff --git a/tfjs-converter/python/tensorflowjs/converters/fold_batch_norms_test.py b/tfjs-converter/python/tensorflowjs/converters/fold_batch_norms_test.py index 21b70a62310..30c63edfeca 100644 --- a/tfjs-converter/python/tensorflowjs/converters/fold_batch_norms_test.py +++ b/tfjs-converter/python/tensorflowjs/converters/fold_batch_norms_test.py @@ -19,7 +19,8 @@ import tempfile import numpy as np -import tensorflow as tf +import tensorflow.compat.v1 as tf1 +import tensorflow.compat.v2 as tf from tensorflow.python.framework import constant_op from tensorflow.python.framework import dtypes from tensorflow.python.framework import importer @@ -40,7 +41,7 @@ def tearDown(self): super(FoldBatchNormsTest, self).tearDown() def testFoldBatchNorms(self): - with tf.compat.v1.Session() as sess: + with tf1.Session() as sess: inputs = [1, 4, 2, 5, 3, 6, -1, -4, -2, -5, -3, -6] input_op = constant_op.constant( np.array(inputs), shape=[1, 1, 6, 2], dtype=dtypes.float32) @@ -71,7 +72,7 @@ def testFoldBatchNorms(self): original_result = sess.run(["output:0"]) optimized_graph_def = fold_batch_norms.fold_batch_norms( original_graph_def) - with tf.compat.v1.Session() as sess: + with tf1.Session() as sess: _ = importer.import_graph_def( optimized_graph_def, input_map={}, name="optimized") optimized_result = sess.run(["optimized/output:0"]) @@ -87,7 +88,7 @@ def testFoldFusedBatchNorms(self): ("NHWC", nn_ops.depthwise_conv2d_native), ("NCHW", nn_ops.depthwise_conv2d_native) ]: - with tf.compat.v1.Session() as sess: + with tf1.Session() as sess: inputs = [1, 4, 2, 5, 3, 6, -1, -4, -2, -5, -3, -6] input_op = constant_op.constant( np.array(inputs), @@ -130,7 +131,7 @@ def testFoldFusedBatchNorms(self): original_result = sess.run(["output:0"]) optimized_graph_def = fold_batch_norms.fold_batch_norms( original_graph_def) - with tf.compat.v1.Session() as sess: + with tf1.Session() as sess: _ = importer.import_graph_def( optimized_graph_def, input_map={}, name="optimized") optimized_result = sess.run(["optimized/output:0"]) @@ -147,13 +148,13 @@ def testFoldFusedBatchNormsV3(self): ("NHWC", nn_ops.depthwise_conv2d_native), ("NCHW", nn_ops.depthwise_conv2d_native) ]: - with tf.compat.v1.Session() as sess: + with tf1.Session() as sess: _generate_fused_batchnorm(data_format, conv2d_func) original_graph_def = sess.graph_def original_result = sess.run(["output:0"]) optimized_graph_def = fold_batch_norms.fold_batch_norms( original_graph_def) - with tf.compat.v1.Session() as sess: + with tf1.Session() as sess: _ = importer.import_graph_def( optimized_graph_def, input_map={}, name="optimized") optimized_result = sess.run(["optimized/output:0"]) @@ -170,8 +171,8 @@ def testFoldFusedBatchNormWithBias(self): ("NHWC", nn_ops.conv2d), ("NHWC", nn_ops.depthwise_conv2d_native), ]: - graph = tf.Graph() - with tf.compat.v1.Session(graph=graph) as sess: + graph = tf1.Graph() + with tf1.Session(graph=graph) as sess: count = 1 add_bias = True _generate_fused_batchnorm(data_format, conv2d_func, count, add_bias) @@ -179,7 +180,7 @@ def testFoldFusedBatchNormWithBias(self): original_result = sess.run(["output:0"]) optimized_graph_def = fold_batch_norms.fold_batch_norms( original_graph_def) - with tf.compat.v1.Session() as sess: + with tf1.Session() as sess: _ = importer.import_graph_def( optimized_graph_def, input_map={}, name="optimized") optimized_result = sess.run(["optimized/output:0"]) @@ -200,13 +201,13 @@ def testFoldFusedBatchNormsWithSharedWeights(self): ("NHWC", nn_ops.depthwise_conv2d_native), ("NCHW", nn_ops.depthwise_conv2d_native) ]: - with tf.compat.v1.Session() as sess: + with tf1.Session() as sess: _generate_fused_batchnorm(data_format, conv2d_func, 2) original_graph_def = sess.graph_def original_result = sess.run(["output:0"]) optimized_graph_def = fold_batch_norms.fold_batch_norms( original_graph_def) - with tf.compat.v1.Session() as sess: + with tf1.Session() as sess: _ = importer.import_graph_def( optimized_graph_def, input_map={}, name="optimized") optimized_result = sess.run(["optimized/output:0"]) diff --git a/tfjs-converter/python/tensorflowjs/converters/fuse_depthwise_conv2d_test.py b/tfjs-converter/python/tensorflowjs/converters/fuse_depthwise_conv2d_test.py index 80d3205c6a8..fd0b954323b 100644 --- a/tfjs-converter/python/tensorflowjs/converters/fuse_depthwise_conv2d_test.py +++ b/tfjs-converter/python/tensorflowjs/converters/fuse_depthwise_conv2d_test.py @@ -18,7 +18,7 @@ import shutil import tempfile -import tensorflow as tf +import tensorflow.compat.v2 as tf from tensorflowjs.converters import fuse_depthwise_conv2d from tensorflowjs.converters import graph_rewrite_util diff --git a/tfjs-converter/python/tensorflowjs/converters/fuse_prelu_test.py b/tfjs-converter/python/tensorflowjs/converters/fuse_prelu_test.py index 08f856b8476..3ec43003771 100644 --- a/tfjs-converter/python/tensorflowjs/converters/fuse_prelu_test.py +++ b/tfjs-converter/python/tensorflowjs/converters/fuse_prelu_test.py @@ -18,7 +18,7 @@ import shutil import tempfile -import tensorflow as tf +import tensorflow.compat.v2 as tf from tensorflow.core.protobuf import config_pb2 from tensorflow.core.protobuf import meta_graph_pb2 diff --git a/tfjs-converter/python/tensorflowjs/converters/generate_test_model.py b/tfjs-converter/python/tensorflowjs/converters/generate_test_model.py index ff2cf335af6..41ec10e73a6 100644 --- a/tfjs-converter/python/tensorflowjs/converters/generate_test_model.py +++ b/tfjs-converter/python/tensorflowjs/converters/generate_test_model.py @@ -22,7 +22,7 @@ import os import sys -import tensorflow as tf +import tensorflow.compat.v2 as tf tf.enable_eager_execution() diff --git a/tfjs-converter/python/tensorflowjs/converters/keras_h5_conversion_test.py b/tfjs-converter/python/tensorflowjs/converters/keras_h5_conversion_test.py index d4fd523cb74..871364aef52 100644 --- a/tfjs-converter/python/tensorflowjs/converters/keras_h5_conversion_test.py +++ b/tfjs-converter/python/tensorflowjs/converters/keras_h5_conversion_test.py @@ -26,8 +26,8 @@ import h5py import numpy as np -import tensorflow as tf -from tensorflow import keras +import tensorflow.compat.v2 as tf +from tensorflow.compat.v2 import keras from tensorflowjs import version from tensorflowjs.converters import keras_h5_conversion as conversion diff --git a/tfjs-converter/python/tensorflowjs/converters/keras_tfjs_loader.py b/tfjs-converter/python/tensorflowjs/converters/keras_tfjs_loader.py index 2478e517331..94568906dd3 100644 --- a/tfjs-converter/python/tensorflowjs/converters/keras_tfjs_loader.py +++ b/tfjs-converter/python/tensorflowjs/converters/keras_tfjs_loader.py @@ -23,7 +23,7 @@ import uuid import six -import tensorflow as tf +import tensorflow.compat.v2 as tf from tensorflow import keras from tensorflowjs import read_weights diff --git a/tfjs-converter/python/tensorflowjs/converters/keras_tfjs_loader_test.py b/tfjs-converter/python/tensorflowjs/converters/keras_tfjs_loader_test.py index d62ddfed77a..bb374cdcbd5 100644 --- a/tfjs-converter/python/tensorflowjs/converters/keras_tfjs_loader_test.py +++ b/tfjs-converter/python/tensorflowjs/converters/keras_tfjs_loader_test.py @@ -27,7 +27,7 @@ import unittest import numpy as np -import tensorflow as tf +import tensorflow.compat.v2 as tf from tensorflow import keras from tensorflowjs.converters import keras_h5_conversion diff --git a/tfjs-converter/python/tensorflowjs/converters/tf_saved_model_conversion_v2_test.py b/tfjs-converter/python/tensorflowjs/converters/tf_saved_model_conversion_v2_test.py index d699839ef50..e8bb8a70125 100644 --- a/tfjs-converter/python/tensorflowjs/converters/tf_saved_model_conversion_v2_test.py +++ b/tfjs-converter/python/tensorflowjs/converters/tf_saved_model_conversion_v2_test.py @@ -22,8 +22,7 @@ import tempfile import unittest -import tensorflow as tf -from tensorflow.contrib import lookup as contrib_lookup +import tensorflow.compat.v2 as tf from tensorflow.python.eager import def_function from tensorflow.python.framework import constant_op from tensorflow.python.framework import dtypes @@ -88,7 +87,7 @@ def _create_saved_model_v1_with_hashtable(self): graph = tf.Graph() with graph.as_default(): - x = tf.placeholder('float32', [2, 2]) + x = tf.compat.v1.placeholder('float32', [2, 2]) w = tf.compat.v1.get_variable('w', shape=[2, 2]) output = tf.compat.v1.matmul(x, w) init_op = w.initializer @@ -96,18 +95,18 @@ def _create_saved_model_v1_with_hashtable(self): # Add a hash table that is not used by the output. keys = tf.constant(['key']) values = tf.constant([1]) - initializer = contrib_lookup.KeyValueTensorInitializer(keys, values) - table = contrib_lookup.HashTable(initializer, -1) + initializer = tf.lookup.KeyValueTensorInitializer(keys, values) + table = tf.lookup.StaticHashTable(initializer, -1) # Create a builder. save_dir = os.path.join(self._tmp_dir, SAVED_MODEL_DIR) - builder = tf.compat.v1.saved_model.builder.SavedModelBuilder(save_dir) + builder = tf.compat.v1.saved_model.builder.SavedModelBuilder( + save_dir) with tf.compat.v1.Session() as sess: # Run the initializer on `w`. sess.run(init_op) - table.init.run() - + table.lookup(keys) builder.add_meta_graph_and_variables( sess, [tf.compat.v1.saved_model.tag_constants.SERVING], signature_def_map={ @@ -280,20 +279,21 @@ def create_frozen_model(self): saved_model_dir = os.path.join(self._tmp_dir, FROZEN_MODEL_DIR) with graph.as_default(): x = tf.constant([[37.0, -23.0], [1.0, 4.0]]) - w = tf.Variable(tf.random_uniform([2, 2])) + w = tf.Variable(tf.random.uniform([2, 2])) y = tf.matmul(x, w) tf.nn.softmax(y) init_op = w.initializer # Create a builder - builder = tf.saved_model.builder.SavedModelBuilder(saved_model_dir) + builder = tf.compat.v1.saved_model.builder.SavedModelBuilder( + saved_model_dir) - with tf.Session() as sess: + with tf.compat.v1.Session() as sess: # Run the initializer on `w`. sess.run(init_op) builder.add_meta_graph_and_variables( - sess, [tf.saved_model.tag_constants.SERVING], + sess, [tf.compat.v1.saved_model.tag_constants.SERVING], signature_def_map=None, assets_collection=None) @@ -311,7 +311,7 @@ def create_frozen_model(self): frozen_file, True, '', - saved_model_tags=tf.saved_model.tag_constants.SERVING, + saved_model_tags=tf.compat.v1.saved_model.tag_constants.SERVING, input_saved_model_dir=saved_model_dir) def test_convert_saved_model_v1(self): diff --git a/tfjs-converter/python/tensorflowjs/converters/wizard.py b/tfjs-converter/python/tensorflowjs/converters/wizard.py index 6fe8c198ad1..990a0598934 100644 --- a/tfjs-converter/python/tensorflowjs/converters/wizard.py +++ b/tfjs-converter/python/tensorflowjs/converters/wizard.py @@ -25,7 +25,7 @@ import PyInquirer import h5py -import tensorflow as tf +import tensorflow.compat.v2 as tf from tensorflow.core.framework import types_pb2 from tensorflow.python.saved_model import loader_impl from tensorflowjs.converters import converter diff --git a/tfjs-converter/python/tensorflowjs/converters/wizard_test.py b/tfjs-converter/python/tensorflowjs/converters/wizard_test.py index def05f4bc41..e3170951a7c 100644 --- a/tfjs-converter/python/tensorflowjs/converters/wizard_test.py +++ b/tfjs-converter/python/tensorflowjs/converters/wizard_test.py @@ -21,7 +21,7 @@ import json import os import shutil -import tensorflow as tf +import tensorflow.compat.v2 as tf from tensorflow import keras from tensorflow.python.eager import def_function from tensorflow.python.ops import variables diff --git a/tfjs-converter/python/test_nightly_pip_package.py b/tfjs-converter/python/test_nightly_pip_package.py index 74de7cfa1d9..a20f36f587a 100644 --- a/tfjs-converter/python/test_nightly_pip_package.py +++ b/tfjs-converter/python/test_nightly_pip_package.py @@ -28,7 +28,7 @@ import unittest import numpy as np -import tensorflow as tf +import tensorflow.compat.v2 as tf from tensorflow import keras from tensorflow.python.eager import def_function from tensorflow.python.framework import constant_op diff --git a/tfjs-converter/python/test_pip_package.py b/tfjs-converter/python/test_pip_package.py index 25a2b5fc377..44fb9b936e5 100644 --- a/tfjs-converter/python/test_pip_package.py +++ b/tfjs-converter/python/test_pip_package.py @@ -28,7 +28,7 @@ import unittest import numpy as np -import tensorflow as tf +import tensorflow.compat.v2 as tf from tensorflow import keras from tensorflow.python.eager import def_function from tensorflow.python.framework import constant_op @@ -151,20 +151,21 @@ def _create_frozen_model(save_path): saved_model_dir = os.path.join(save_path) with graph.as_default(): x = tf.constant([[37.0, -23.0], [1.0, 4.0]]) - w = tf.Variable(tf.random_uniform([2, 2])) + w = tf.Variable(tf.random.uniform([2, 2])) y = tf.matmul(x, w) tf.nn.softmax(y) init_op = w.initializer # Create a builder - builder = tf.saved_model.builder.SavedModelBuilder(saved_model_dir) + builder = tf.compat.v1.saved_model.builder.SavedModelBuilder( + saved_model_dir) - with tf.Session() as sess: + with tf.compat.v1.Session() as sess: # Run the initializer on `w`. sess.run(init_op) builder.add_meta_graph_and_variables( - sess, [tf.saved_model.tag_constants.SERVING], + sess, [tf.compat.v1.saved_model.tag_constants.SERVING], signature_def_map=None, assets_collection=None) @@ -182,7 +183,7 @@ def _create_frozen_model(save_path): frozen_file, True, '', - saved_model_tags=tf.saved_model.tag_constants.SERVING, + saved_model_tags=tf.compat.v1.saved_model.tag_constants.SERVING, input_saved_model_dir=saved_model_dir) class APIAndShellTest(tf.test.TestCase): """Tests for the Python API of the pip package.""" From 239aeadfad35cfafd10e44818f269c24f5123b39 Mon Sep 17 00:00:00 2001 From: Ping Yu <4018+pyu10055@users.noreply.github.com> Date: Thu, 2 Jan 2020 09:38:31 -0800 Subject: [PATCH 2/8] fix lint --- tfjs-converter/python/tensorflowjs/converters/converter.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tfjs-converter/python/tensorflowjs/converters/converter.py b/tfjs-converter/python/tensorflowjs/converters/converter.py index 4be3a02fd07..86d0c186625 100644 --- a/tfjs-converter/python/tensorflowjs/converters/converter.py +++ b/tfjs-converter/python/tensorflowjs/converters/converter.py @@ -168,7 +168,8 @@ def dispatch_keras_saved_model_to_tensorflowjs_conversion( (Default: `False`). """ with tf.Graph().as_default(), tf.compat.v1.Session(): - model = tf.keras.modelexperimental.load_from_saved_model(keras_saved_model_path) + model = tf.keras.modelexperimental.load_from_saved_model( + keras_saved_model_path) # Save model temporarily in HDF5 format. temp_h5_path = tempfile.mktemp(suffix='.h5') From 38d58182e85836aa47a4ff5a4683dd35a6500d21 Mon Sep 17 00:00:00 2001 From: Ping Yu <4018+pyu10055@users.noreply.github.com> Date: Thu, 2 Jan 2020 11:56:32 -0800 Subject: [PATCH 3/8] use 2.1.0rc2 due to an error on error saved model api --- tfjs-converter/python/requirements.txt | 6 ++--- .../tensorflowjs/converters/converter.py | 11 ++++---- .../tensorflowjs/converters/converter_test.py | 25 ++++++++++--------- .../tensorflowjs/converters/wizard_test.py | 8 +++--- tfjs-converter/python/test_pip_package.py | 10 ++++---- 5 files changed, 30 insertions(+), 30 deletions(-) diff --git a/tfjs-converter/python/requirements.txt b/tfjs-converter/python/requirements.txt index a83b65c2bc4..59b3f0028ed 100644 --- a/tfjs-converter/python/requirements.txt +++ b/tfjs-converter/python/requirements.txt @@ -1,7 +1,7 @@ h5py==2.8.0 -numpy==1.16.4 -six==1.11.0 -tensorflow==2.0.0 +numpy>=1.16.4 +six>=1.12.0 +tensorflow==2.1.0rc2 tensorflow-hub==0.5.0 gast==0.2.2 PyInquirer==1.0.3 diff --git a/tfjs-converter/python/tensorflowjs/converters/converter.py b/tfjs-converter/python/tensorflowjs/converters/converter.py index 86d0c186625..0bf1bb25fa8 100644 --- a/tfjs-converter/python/tensorflowjs/converters/converter.py +++ b/tfjs-converter/python/tensorflowjs/converters/converter.py @@ -156,7 +156,7 @@ def dispatch_keras_saved_model_to_tensorflowjs_conversion( keras_saved_model_path: path to a folder in which the assets/saved_model.json can be found. This is usually a subfolder that is under the folder passed to - `keras.experimental.export_saved_model()` and has a Unix epoch time + `tf.keras.models.save_model()` and has a Unix epoch time as its name (e.g., 1542212752). output_dir: Output directory to which the TensorFlow.js-format model JSON file and weights files will be written. If the directory does not exist, @@ -168,12 +168,11 @@ def dispatch_keras_saved_model_to_tensorflowjs_conversion( (Default: `False`). """ with tf.Graph().as_default(), tf.compat.v1.Session(): - model = tf.keras.modelexperimental.load_from_saved_model( - keras_saved_model_path) + model = tf.keras.models.load_model(keras_saved_model_path) # Save model temporarily in HDF5 format. temp_h5_path = tempfile.mktemp(suffix='.h5') - model.save(temp_h5_path) + model.save(temp_h5_path, save_format='h5') assert os.path.isfile(temp_h5_path) dispatch_keras_h5_to_tfjs_layers_model_conversion( @@ -255,8 +254,8 @@ def dispatch_tensorflowjs_to_keras_saved_model_conversion( with tf.Graph().as_default(), tf.compat.v1.Session(): model = keras_tfjs_loader.load_keras_model(config_json_path) - keras.experimental.export_saved_model( - model, keras_saved_model_path, serving_only=True) + tf.keras.models.save_model( + model, keras_saved_model_path) def dispatch_tensorflowjs_to_tensorflowjs_conversion( diff --git a/tfjs-converter/python/tensorflowjs/converters/converter_test.py b/tfjs-converter/python/tensorflowjs/converters/converter_test.py index 71154a9aea0..fa8049a7887 100644 --- a/tfjs-converter/python/tensorflowjs/converters/converter_test.py +++ b/tfjs-converter/python/tensorflowjs/converters/converter_test.py @@ -335,12 +335,17 @@ def _createSimpleSequentialModel(self): model.add(keras.layers.Reshape([2, 3], input_shape=[6])) model.add(keras.layers.LSTM(10)) model.add(keras.layers.Dense(1, activation='sigmoid')) + model.compile(optimizer='adam', loss='binary_crossentropy') + model.predict(tf.ones((1, 6)), steps=1) + tf.keras.backend.set_learning_phase(0) return model def _createNestedSequentialModel(self): model = keras.Sequential() model.add(keras.layers.Dense(6, input_shape=[10], activation='relu')) model.add(self._createSimpleSequentialModel()) + model.compile(optimizer='adam', loss='binary_crossentropy') + model.predict(tf.ones((1, 10)), steps=1) return model def _createFunctionalModelWithWeights(self): @@ -349,6 +354,8 @@ def _createFunctionalModelWithWeights(self): y = keras.layers.Concatenate()([input1, input2]) y = keras.layers.Dense(4, activation='softmax')(y) model = keras.Model([input1, input2], y) + model.compile(optimizer='adam', loss='binary_crossentropy') + model.predict([tf.ones((1, 8)), tf.ones((1, 10))], steps=1) return model def testConvertTfKerasSequentialSavedAsSavedModel(self): @@ -356,7 +363,7 @@ def testConvertTfKerasSequentialSavedAsSavedModel(self): model = self._createSimpleSequentialModel() old_model_json = json.loads(model.to_json()) old_weights = model.get_weights() - keras.experimental.export_saved_model(model, self._tmp_dir) + tf.keras.models.save_model(model, self._tmp_dir) # Convert the keras SavedModel to tfjs format. tfjs_output_dir = os.path.join(self._tmp_dir, 'tfjs') @@ -384,14 +391,10 @@ def testConvertTfKerasSequentialSavedAsSavedModel(self): def testConvertTfKerasSequentialCompiledAndSavedAsSavedModel(self): with tf.Graph().as_default(), tf.compat.v1.Session(): model = self._createSimpleSequentialModel() - # Compile the model before saving. - model.compile( - loss='binary_crossentropy', - optimizer=tf.compat.v1.train.GradientDescentOptimizer(2.5e-3)) old_model_json = json.loads(model.to_json()) old_weights = model.get_weights() - keras.experimental.export_saved_model(model, self._tmp_dir) + tf.keras.models.save_model(model, self._tmp_dir) # Convert the keras SavedModel to tfjs format. tfjs_output_dir = os.path.join(self._tmp_dir, 'tfjs') @@ -419,7 +422,7 @@ def testConvertTfKerasSequentialCompiledAndSavedAsSavedModel(self): def testWrongConverterRaisesCorrectErrorMessage(self): with tf.Graph().as_default(), tf.compat.v1.Session(): model = self._createSimpleSequentialModel() - keras.experimental.export_saved_model(model, self._tmp_dir) + tf.keras.models.save_model(model, self._tmp_dir) # Convert the keras SavedModel to tfjs format. tfjs_output_dir = os.path.join(self._tmp_dir, 'tfjs') @@ -436,7 +439,7 @@ def testConvertTfKerasNestedSequentialSavedAsSavedModel(self): model = self._createNestedSequentialModel() old_model_json = json.loads(model.to_json()) old_weights = model.get_weights() - keras.experimental.export_saved_model(model, self._tmp_dir) + tf.keras.models.save_model(model, self._tmp_dir) # Convert the keras SavedModel to tfjs format. tfjs_output_dir = os.path.join(self._tmp_dir, 'tfjs') @@ -466,8 +469,7 @@ def testConvertTfKerasFunctionalModelWithWeightsSavedAsSavedModel(self): model = self._createFunctionalModelWithWeights() old_model_json = json.loads(model.to_json()) old_weights = model.get_weights() - keras.experimental.export_saved_model( - model, self._tmp_dir) + tf.keras.models.save_model(model, self._tmp_dir) # Convert the keras SavedModel to tfjs format. tfjs_output_dir = os.path.join(self._tmp_dir, 'tfjs') @@ -495,8 +497,7 @@ def testConvertTfKerasFunctionalModelWithWeightsSavedAsSavedModel(self): def testConvertTfKerasSequentialSavedAsSavedModelWithQuantization(self): with tf.Graph().as_default(), tf.compat.v1.Session(): model = self._createSimpleSequentialModel() - keras.experimental.export_saved_model( - model, self._tmp_dir) + tf.keras.models.save_model(model, self._tmp_dir) # Convert the keras SavedModel to tfjs format. tfjs_output_dir = os.path.join(self._tmp_dir, 'tfjs') diff --git a/tfjs-converter/python/tensorflowjs/converters/wizard_test.py b/tfjs-converter/python/tensorflowjs/converters/wizard_test.py index e3170951a7c..beafe4f4dec 100644 --- a/tfjs-converter/python/tensorflowjs/converters/wizard_test.py +++ b/tfjs-converter/python/tensorflowjs/converters/wizard_test.py @@ -70,7 +70,7 @@ def _create_keras_saved_model(self): model.add(keras.layers.LSTM(10)) model.add(keras.layers.Dense(1, activation='sigmoid')) save_dir = os.path.join(self._tmp_dir, SAVED_MODEL_DIR) - keras.experimental.export_saved_model(model, save_dir) + tf.keras.models.save_model(model, save_dir) def _create_saved_model(self): """Test a basic model with functions to make sure functions are inlined.""" @@ -172,11 +172,11 @@ def testAvailableTags(self): def testAvailableSignatureNames(self): self._create_saved_model() save_dir = os.path.join(self._tmp_dir, SAVED_MODEL_DIR) - self.assertEqual(['__saved_model_init_op', 'serving_default'], - [x['value'] for x in wizard.available_signature_names( + self.assertEqual(sorted(['__saved_model_init_op', 'serving_default']), + sorted([x['value'] for x in wizard.available_signature_names( {'input_path': save_dir, 'input_format': 'tf_saved_model', - 'saved_model_tags': 'serve'})]) + 'saved_model_tags': 'serve'})])) def testGenerateCommandForSavedModel(self): options = {'input_format': 'tf_saved_model', diff --git a/tfjs-converter/python/test_pip_package.py b/tfjs-converter/python/test_pip_package.py index 44fb9b936e5..f0d299bded8 100644 --- a/tfjs-converter/python/test_pip_package.py +++ b/tfjs-converter/python/test_pip_package.py @@ -722,7 +722,7 @@ def testConvertTfKerasNestedSequentialSavedModelIntoTfjsFormat(self): model = self._createNestedSequentialModel() y = model.predict(x) - keras.experimental.export_saved_model(model, self._tmp_dir) + keras..export_saved_model(model, self._tmp_dir) # 2. Convert the keras saved model to tfjs format. tfjs_output_dir = os.path.join(self._tmp_dir, 'tfjs') @@ -763,7 +763,7 @@ def testConvertTfKerasFunctionalSavedModelIntoTfjsFormat(self): model = self._createFunctionalModelWithWeights() y = model.predict([x1, x2]) - keras.experimental.export_saved_model(model, self._tmp_dir) + tf.keras.models.save_model(model, self._tmp_dir) # 2. Convert the keras saved model to tfjs format. tfjs_output_dir = os.path.join(self._tmp_dir, 'tfjs') @@ -804,7 +804,7 @@ def testUsingIncorrectKerasSavedModelRaisesError(self): model = self._createNestedSequentialModel() y = model.predict(x) - keras.experimental.export_saved_model(model, self._tmp_dir) + tf.keras.models.save_model(model, self._tmp_dir) # 2. Convert the keras saved model to tfjs format. tfjs_output_dir = os.path.join(self._tmp_dir, 'tfjs') @@ -833,7 +833,7 @@ def testConvertTfjsLayersModelIntoShardedWeights(self): weights = model.get_weights() total_weight_bytes = sum(np.size(w) for w in weights) * 4 - keras.experimental.export_saved_model(model, self._tmp_dir) + tf.keras.models.save_model(model, self._tmp_dir) # 2. Convert the keras saved model to tfjs_layers_model format. tfjs_output_dir = os.path.join(self._tmp_dir, 'tfjs') @@ -897,7 +897,7 @@ def testConvertTfjsLayersModelWithQuantization(self): weights = model.get_weights() total_weight_bytes = sum(np.size(w) for w in weights) * 4 - keras.experimental.export_saved_model(model, self._tmp_dir) + tf.keras.models.save_model(model, self._tmp_dir) # 2. Convert the keras saved model to tfjs_layers_model format. tfjs_output_dir = os.path.join(self._tmp_dir, 'tfjs') From a069db00cf6d5bf4aaf5c9e2f430a56d51924f5d Mon Sep 17 00:00:00 2001 From: Ping Yu <4018+pyu10055@users.noreply.github.com> Date: Thu, 2 Jan 2020 13:59:56 -0800 Subject: [PATCH 4/8] fix integration tests --- tfjs-converter/python/requirements.txt | 2 +- .../python/tensorflowjs/converters/converter.py | 2 +- .../python/tensorflowjs/converters/wizard_test.py | 9 +++++---- tfjs-converter/python/test_pip_package.py | 15 +++++++++++---- 4 files changed, 18 insertions(+), 10 deletions(-) diff --git a/tfjs-converter/python/requirements.txt b/tfjs-converter/python/requirements.txt index 59b3f0028ed..d9744c34cc2 100644 --- a/tfjs-converter/python/requirements.txt +++ b/tfjs-converter/python/requirements.txt @@ -2,6 +2,6 @@ h5py==2.8.0 numpy>=1.16.4 six>=1.12.0 tensorflow==2.1.0rc2 -tensorflow-hub==0.5.0 +tensorflow-hub==0.7.0 gast==0.2.2 PyInquirer==1.0.3 diff --git a/tfjs-converter/python/tensorflowjs/converters/converter.py b/tfjs-converter/python/tensorflowjs/converters/converter.py index 0bf1bb25fa8..deacdfd96e3 100644 --- a/tfjs-converter/python/tensorflowjs/converters/converter.py +++ b/tfjs-converter/python/tensorflowjs/converters/converter.py @@ -78,7 +78,7 @@ def dispatch_keras_h5_to_tfjs_layers_model_conversion( 'Expected path to point to an HDF5 file, but it points to a ' 'directory: %s' % h5_path) - h5_file = h5py.File(h5_path) + h5_file = h5py.File(h5_path, 'r') if 'layer_names' in h5_file.attrs: model_json = None groups = conversion.h5_weights_to_tfjs_format( diff --git a/tfjs-converter/python/tensorflowjs/converters/wizard_test.py b/tfjs-converter/python/tensorflowjs/converters/wizard_test.py index beafe4f4dec..752eac58918 100644 --- a/tfjs-converter/python/tensorflowjs/converters/wizard_test.py +++ b/tfjs-converter/python/tensorflowjs/converters/wizard_test.py @@ -173,10 +173,11 @@ def testAvailableSignatureNames(self): self._create_saved_model() save_dir = os.path.join(self._tmp_dir, SAVED_MODEL_DIR) self.assertEqual(sorted(['__saved_model_init_op', 'serving_default']), - sorted([x['value'] for x in wizard.available_signature_names( - {'input_path': save_dir, - 'input_format': 'tf_saved_model', - 'saved_model_tags': 'serve'})])) + sorted( + [x['value'] for x in wizard.available_signature_names( + {'input_path': save_dir, + 'input_format': 'tf_saved_model', + 'saved_model_tags': 'serve'})])) def testGenerateCommandForSavedModel(self): options = {'input_format': 'tf_saved_model', diff --git a/tfjs-converter/python/test_pip_package.py b/tfjs-converter/python/test_pip_package.py index f0d299bded8..0eaef70ef97 100644 --- a/tfjs-converter/python/test_pip_package.py +++ b/tfjs-converter/python/test_pip_package.py @@ -68,8 +68,11 @@ def _createKerasModel(layer_name_prefix, h5_path=None): kernel_initializer='ones', name=layer_name_prefix + '2')(dense1) model = keras.models.Model(inputs=[input_tensor], outputs=[output]) + model.compile(optimizer='adam', loss='binary_crossentropy') + model.predict(tf.ones((1, 3)), steps=1) + if h5_path: - model.save(h5_path) + model.save(h5_path, save_format='h5') return model def _createTensorFlowSavedModelV1(name_scope, save_path): @@ -722,7 +725,7 @@ def testConvertTfKerasNestedSequentialSavedModelIntoTfjsFormat(self): model = self._createNestedSequentialModel() y = model.predict(x) - keras..export_saved_model(model, self._tmp_dir) + keras.models.save_model(model, self._tmp_dir) # 2. Convert the keras saved model to tfjs format. tfjs_output_dir = os.path.join(self._tmp_dir, 'tfjs') @@ -939,9 +942,11 @@ def testConvertTfjsLayersModelToTfjsGraphModel(self): model = keras.Sequential() model.add(keras.layers.Dense(10, activation='relu', input_shape=[4])) model.add(keras.layers.Dense(1, activation='sigmoid')) + model.compile(optimizer='adam', loss='binary_crossentropy') + model.predict(tf.ones((1, 4)), steps=1) h5_path = os.path.join(self._tmp_dir, 'model.h5') - model.save(h5_path) + model.save(h5_path, save_format='h5') # 2. Convert the keras saved model to tfjs_layers_model format. layers_model_output_dir = os.path.join(self._tmp_dir, 'tfjs_layers') @@ -975,9 +980,11 @@ def testConvertTfjsLayersModelToKerasSavedModel(self): model = keras.Sequential() model.add(keras.layers.Dense(10, activation='relu', input_shape=[4])) model.add(keras.layers.Dense(1, activation='sigmoid')) + model.compile(optimizer='adam', loss='binary_crossentropy') + model.predict(tf.ones((1, 4)), steps=1) h5_path = os.path.join(self._tmp_dir, 'model.h5') - model.save(h5_path) + model.save(h5_path, save_format='h5') # 2. Convert the keras saved model to tfjs_layers_model format. layers_model_output_dir = os.path.join(self._tmp_dir, 'tfjs_layers') From 3cc872ad73b674b47cf7948f5421dec661d7aeac Mon Sep 17 00:00:00 2001 From: Ping Yu <4018+pyu10055@users.noreply.github.com> Date: Thu, 2 Jan 2020 14:31:43 -0800 Subject: [PATCH 5/8] fix pylint error and clean up the pip test --- tfjs-converter/python/setup.py | 6 +- .../python/test_nightly_pip_package.py | 15 --- tfjs-converter/python/test_pip_package.py | 97 ++++--------------- 3 files changed, 21 insertions(+), 97 deletions(-) diff --git a/tfjs-converter/python/setup.py b/tfjs-converter/python/setup.py index a6a0b8535b3..e2ad3c1db96 100644 --- a/tfjs-converter/python/setup.py +++ b/tfjs-converter/python/setup.py @@ -21,9 +21,9 @@ DIR_NAME = os.path.dirname(__file__) def _get_requirements(file): - "Reads the requirements file and returns the packages" - with open(os.path.join(DIR_NAME, file), 'r') as requirements: - return requirements.readlines() + "Reads the requirements file and returns the packages" + with open(os.path.join(DIR_NAME, file), 'r') as requirements: + return requirements.readlines() CONSOLE_SCRIPTS = [ 'tensorflowjs_converter = tensorflowjs.converters.converter:pip_main', diff --git a/tfjs-converter/python/test_nightly_pip_package.py b/tfjs-converter/python/test_nightly_pip_package.py index a20f36f587a..adb4ec9c542 100644 --- a/tfjs-converter/python/test_nightly_pip_package.py +++ b/tfjs-converter/python/test_nightly_pip_package.py @@ -19,28 +19,13 @@ from __future__ import print_function import glob -import json import os import shutil import subprocess -import sys import tempfile -import unittest -import numpy as np import tensorflow.compat.v2 as tf -from tensorflow import keras -from tensorflow.python.eager import def_function -from tensorflow.python.framework import constant_op -from tensorflow.python.framework import dtypes -from tensorflow.python.framework import tensor_spec -from tensorflow.python.ops import variables -from tensorflow.python.tools import freeze_graph -from tensorflow.python.training.tracking import tracking from tensorflow.python.saved_model.save import save -import tensorflow_hub as hub - -import tensorflowjs as tfjs class APIAndShellTest(tf.test.TestCase): """Nightly tests for the Python API of the pip package.""" diff --git a/tfjs-converter/python/test_pip_package.py b/tfjs-converter/python/test_pip_package.py index 0eaef70ef97..4b7c8aa3104 100644 --- a/tfjs-converter/python/test_pip_package.py +++ b/tfjs-converter/python/test_pip_package.py @@ -25,15 +25,13 @@ import subprocess import sys import tempfile -import unittest import numpy as np import tensorflow.compat.v2 as tf +from tensorflow.compat.v1 import saved_model from tensorflow import keras from tensorflow.python.eager import def_function from tensorflow.python.framework import constant_op -from tensorflow.python.framework import dtypes -from tensorflow.python.framework import tensor_spec from tensorflow.python.ops import variables from tensorflow.python.tools import freeze_graph from tensorflow.python.training.tracking import tracking @@ -92,17 +90,17 @@ def _createTensorFlowSavedModelV1(name_scope, save_path): init_op = w.initializer # Create a builder. - builder = tf.compat.v1.saved_model.builder.SavedModelBuilder(save_path) + builder = saved_model.builder.SavedModelBuilder(save_path) with tf.compat.v1.Session() as sess: # Run the initializer on `w`. sess.run(init_op) builder.add_meta_graph_and_variables( - sess, [tf.compat.v1.saved_model.tag_constants.SERVING], + sess, [saved_model.tag_constants.SERVING], signature_def_map={ "serving_default": - tf.compat.v1.saved_model.signature_def_utils.predict_signature_def( + saved_model.signature_def_utils.predict_signature_def( inputs={"x": x}, outputs={"output": output}) }, @@ -110,12 +108,10 @@ def _createTensorFlowSavedModelV1(name_scope, save_path): builder.save() -def _createTensorFlowSavedModel(name_scope, save_path): +def _createTensorFlowSavedModel(save_path): """Create a TensorFlow SavedModel for testing. Args: - name_scope: Name scope to create the model under. This helps avoid - op and variable name clashes between different test methods. save_path: The directory path in which to save the model. """ @@ -160,7 +156,7 @@ def _create_frozen_model(save_path): init_op = w.initializer # Create a builder - builder = tf.compat.v1.saved_model.builder.SavedModelBuilder( + builder = saved_model.builder.SavedModelBuilder( saved_model_dir) with tf.compat.v1.Session() as sess: @@ -168,7 +164,7 @@ def _create_frozen_model(save_path): sess.run(init_op) builder.add_meta_graph_and_variables( - sess, [tf.compat.v1.saved_model.tag_constants.SERVING], + sess, [saved_model.tag_constants.SERVING], signature_def_map=None, assets_collection=None) @@ -186,7 +182,7 @@ def _create_frozen_model(save_path): frozen_file, True, '', - saved_model_tags=tf.compat.v1.saved_model.tag_constants.SERVING, + saved_model_tags=saved_model.tag_constants.SERVING, input_saved_model_dir=saved_model_dir) class APIAndShellTest(tf.test.TestCase): """Tests for the Python API of the pip package.""" @@ -198,7 +194,7 @@ def setUpClass(cls): cls.tf_saved_model_v1_dir = os.path.join( cls.class_tmp_dir, 'tf_saved_model_v1') cls.tf_frozen_model_dir = os.path.join(cls.class_tmp_dir, 'tf_frozen_model') - _createTensorFlowSavedModel('a', cls.tf_saved_model_dir) + _createTensorFlowSavedModel(cls.tf_saved_model_dir) _createTensorFlowSavedModelV1('b', cls.tf_saved_model_v1_dir) _create_frozen_model(cls.tf_frozen_model_dir) cls.tf_hub_module_dir = os.path.join(cls.class_tmp_dir, 'tf_hub_module') @@ -268,7 +264,8 @@ def testSaveKerasModel(self): self.assertEqual(weight_dtypes['MergedDense2/kernel'], 'float32') def testLoadKerasModel(self): - # Use separate tf.Graph and tf.compat.v1.Session contexts to prevent name collision. + # Use separate tf.Graph and tf.compat.v1.Session contexts + # to prevent name collision. with tf.Graph().as_default(), tf.compat.v1.Session(): # First create a toy keras model. model1 = _createKerasModel('MergedDense') @@ -498,9 +495,9 @@ def testConvertTFSavedModelWithCommandLineWorks(self): weights = [{ 'paths': ['group1-shard1of1.bin'], 'weights': [{ - 'dtype': 'float32', - 'shape': [], - 'name': 'StatefulPartitionedCall/mul' + 'dtype': 'float32', + 'shape': [], + 'name': 'StatefulPartitionedCall/mul' }] }] @@ -523,31 +520,6 @@ def testConvertTFSavedModelWithCommandLineWorks(self): # Check the content of the output directory. self.assertTrue(glob.glob(os.path.join(output_dir, 'group*-*'))) - def testConvertTFHubModuleWithCommandLineWorks(self): - output_dir = os.path.join(self._tmp_dir) - process = subprocess.Popen([ - 'tensorflowjs_converter', '--input_format', 'tf_hub', - self.tf_hub_module_dir, output_dir - ]) - process.communicate() - self.assertEqual(0, process.returncode) - - weights = [{ - 'paths': ['group1-shard1of1.bin'], - 'weights': [{ - 'shape': [2], - 'name': 'module/Variable', - 'dtype': 'float32' - }] - }] - # Load the saved weights as a JSON string. - output_json = json.load( - open(os.path.join(output_dir, 'model.json'), 'rt')) - self.assertEqual(output_json['weightsManifest'], weights) - - # Check the content of the output directory. - self.assertTrue(glob.glob(os.path.join(output_dir, 'group*-*'))) - def testConvertTFFrozenModelWithCommandLineWorks(self): output_dir = os.path.join(self._tmp_dir) frozen_file = os.path.join(self.tf_frozen_model_dir, 'frozen.pb') @@ -582,31 +554,6 @@ def testConvertTFFrozenModelWithCommandLineWorks(self): # Check the content of the output directory. self.assertTrue(glob.glob(os.path.join(output_dir, 'group*-*'))) - def testConvertTFHubModuleWithCommandLineWorks(self): - output_dir = os.path.join(self._tmp_dir) - process = subprocess.Popen([ - 'tensorflowjs_converter', '--input_format', 'tf_hub', - self.tf_hub_module_dir, output_dir - ]) - process.communicate() - self.assertEqual(0, process.returncode) - - weights = [{ - 'paths': ['group1-shard1of1.bin'], - 'weights': [{ - 'shape': [2], - 'name': 'module/Variable', - 'dtype': 'float32' - }] - }] - # Load the saved weights as a JSON string. - output_json = json.load( - open(os.path.join(output_dir, 'model.json'), 'rt')) - self.assertEqual(output_json['weightsManifest'], weights) - - # Check the content of the output directory. - self.assertTrue(glob.glob(os.path.join(output_dir, 'group*-*'))) - def testConvertTensorflowjsArtifactsToKerasH5(self): # 1. Create a toy keras model and save it as an HDF5 file. os.makedirs(os.path.join(self._tmp_dir, 'keras_h5')) @@ -800,12 +747,9 @@ def testConvertTfKerasFunctionalSavedModelIntoTfjsFormat(self): def testUsingIncorrectKerasSavedModelRaisesError(self): with tf.Graph().as_default(), tf.compat.v1.Session(): - x = np.random.randn(8, 10) - # 1. Run the model.predict(), store the result. Then saved the model # as a SavedModel. model = self._createNestedSequentialModel() - y = model.predict(x) tf.keras.models.save_model(model, self._tmp_dir) @@ -814,8 +758,8 @@ def testUsingIncorrectKerasSavedModelRaisesError(self): # Use incorrect --input_format value: keras process = subprocess.Popen( [ - 'tensorflowjs_converter', '--input_format', 'keras', - self._tmp_dir, tfjs_output_dir + 'tensorflowjs_converter', '--input_format', 'keras', + self._tmp_dir, tfjs_output_dir ], stdout=subprocess.PIPE, stderr=subprocess.PIPE) @@ -890,12 +834,8 @@ def testConvertTfjsLayersModelIntoShardedWeights(self): def testConvertTfjsLayersModelWithQuantization(self): with tf.Graph().as_default(), tf.compat.v1.Session(): - x = np.random.randn(8, 10) - - # 1. Run the model.predict(), store the result. Then saved the model - # as a SavedModel. + # 1. Saved the model as a SavedModel. model = self._createNestedSequentialModel() - y = model.predict(x) weights = model.get_weights() total_weight_bytes = sum(np.size(w) for w in weights) * 4 @@ -921,6 +861,7 @@ def testConvertTfjsLayersModelWithQuantization(self): 'tensorflowjs_converter', '--input_format', 'tfjs_layers_model', '--output_format', 'tfjs_layers_model', '--quantization_bytes', '2', + '--weight_shard_size_bytes', weight_shard_size_bytes, os.path.join(tfjs_output_dir, 'model.json'), sharded_model_dir ]) process.communicate() @@ -935,8 +876,6 @@ def testConvertTfjsLayersModelWithQuantization(self): self.assertEqual(weight_file_size, total_weight_bytes // 2) def testConvertTfjsLayersModelToTfjsGraphModel(self): - x = np.random.randn(8, 10) - with tf.Graph().as_default(), tf.compat.v1.Session(): # 1. Create a model for testing. model = keras.Sequential() From 19f8a48cdf2603e66138b633bc3002c9b4e9a3ac Mon Sep 17 00:00:00 2001 From: Ping Yu <4018+pyu10055@users.noreply.github.com> Date: Thu, 2 Jan 2020 14:43:45 -0800 Subject: [PATCH 6/8] fix the pip package test --- tfjs-converter/python/test_pip_package.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/tfjs-converter/python/test_pip_package.py b/tfjs-converter/python/test_pip_package.py index 4b7c8aa3104..65d11b509b1 100644 --- a/tfjs-converter/python/test_pip_package.py +++ b/tfjs-converter/python/test_pip_package.py @@ -647,12 +647,16 @@ def _createSimpleSequentialModel(self): model.add(keras.layers.Reshape([2, 3], input_shape=[6])) model.add(keras.layers.LSTM(10)) model.add(keras.layers.Dense(1, activation='sigmoid')) + model.compile(optimizer='adam', loss='binary_crossentropy') + model.predict(tf.ones((1, 6)), steps=1) return model def _createNestedSequentialModel(self): model = keras.Sequential() model.add(keras.layers.Dense(6, input_shape=[10], activation='relu')) model.add(self._createSimpleSequentialModel()) + model.compile(optimizer='adam', loss='binary_crossentropy') + model.predict(tf.ones((1, 10)), steps=1) return model def _createFunctionalModelWithWeights(self): @@ -661,6 +665,8 @@ def _createFunctionalModelWithWeights(self): y = keras.layers.Concatenate()([input1, input2]) y = keras.layers.Dense(4, activation='softmax')(y) model = keras.Model([input1, input2], y) + model.compile(optimizer='adam', loss='binary_crossentropy') + model.predict([tf.ones((1, 8)), tf.ones((1, 10))], steps=1) return model def testConvertTfKerasNestedSequentialSavedModelIntoTfjsFormat(self): @@ -750,7 +756,6 @@ def testUsingIncorrectKerasSavedModelRaisesError(self): # 1. Run the model.predict(), store the result. Then saved the model # as a SavedModel. model = self._createNestedSequentialModel() - tf.keras.models.save_model(model, self._tmp_dir) # 2. Convert the keras saved model to tfjs format. @@ -854,14 +859,11 @@ def testConvertTfjsLayersModelWithQuantization(self): # 3. Convert the tfjs_layers_model to another tfjs_layers_model, # with uint16 quantization. - weight_shard_size_bytes = int(total_weight_bytes * 0.3) - # Due to the shard size, there ought to be 4 shards after conversion. sharded_model_dir = os.path.join(self._tmp_dir, 'tfjs_sharded') process = subprocess.Popen([ 'tensorflowjs_converter', '--input_format', 'tfjs_layers_model', '--output_format', 'tfjs_layers_model', '--quantization_bytes', '2', - '--weight_shard_size_bytes', weight_shard_size_bytes, os.path.join(tfjs_output_dir, 'model.json'), sharded_model_dir ]) process.communicate() From d4b1aa080db4253f86009b1c7bec6e8df6aadc14 Mon Sep 17 00:00:00 2001 From: Ping Yu <4018+pyu10055@users.noreply.github.com> Date: Thu, 2 Jan 2020 14:46:07 -0800 Subject: [PATCH 7/8] relex the pip requirement for h5py --- tfjs-converter/python/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tfjs-converter/python/requirements.txt b/tfjs-converter/python/requirements.txt index d9744c34cc2..89c25d8a939 100644 --- a/tfjs-converter/python/requirements.txt +++ b/tfjs-converter/python/requirements.txt @@ -1,4 +1,4 @@ -h5py==2.8.0 +h5py>=2.8.0 numpy>=1.16.4 six>=1.12.0 tensorflow==2.1.0rc2 From 644db596c13222c723173037226e0d5ad9342a9e Mon Sep 17 00:00:00 2001 From: Ping Yu <4018+pyu10055@users.noreply.github.com> Date: Wed, 8 Jan 2020 13:47:09 -0800 Subject: [PATCH 8/8] update to 2.1.0 --- tfjs-converter/python/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tfjs-converter/python/requirements.txt b/tfjs-converter/python/requirements.txt index 89c25d8a939..dd19b5295c8 100644 --- a/tfjs-converter/python/requirements.txt +++ b/tfjs-converter/python/requirements.txt @@ -1,7 +1,7 @@ h5py>=2.8.0 numpy>=1.16.4 six>=1.12.0 -tensorflow==2.1.0rc2 +tensorflow-cpu==2.1.0 tensorflow-hub==0.7.0 gast==0.2.2 PyInquirer==1.0.3