Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 6 additions & 7 deletions tfjs-converter/python/tensorflowjs/converters/converter.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
# ==============================================================================
"""Artifact conversion to and from Python TensorFlow and Keras."""
"""Artifact conversion to and from Python TensorFlow and tf.keras."""

from __future__ import absolute_import
from __future__ import division
Expand All @@ -28,7 +28,6 @@
import h5py
import numpy as np
import tensorflow as tf
from tensorflow import keras

from tensorflowjs import quantization
from tensorflowjs import version
Expand All @@ -49,7 +48,7 @@ def dispatch_keras_h5_to_tfjs_layers_model_conversion(
- A weights-only HDF5 (e.g., generated with Keras Model's `save_weights()`
method),
- A topology+weights combined HDF5 (e.g., generated with
`keras.model.save_model`).
`tf.keras.model.save_model`).

Args:
h5_path: path to an HDF5 file containing keras model data as a `str`.
Expand Down Expand Up @@ -130,7 +129,7 @@ def dispatch_keras_h5_to_tfjs_graph_model_conversion(
'directory: %s' % h5_path)

temp_savedmodel_dir = tempfile.mktemp(suffix='.savedmodel')
model = keras.models.load_model(h5_path, compile=False)
model = tf.keras.models.load_model(h5_path, compile=False)
model.save(temp_savedmodel_dir, include_optimizer=False, save_format='tf')

# NOTE(cais): This cannot use `tf.compat.v1` because
Expand All @@ -155,7 +154,7 @@ def dispatch_keras_saved_model_to_tensorflowjs_conversion(
"""Converts keras model saved in the SavedModel format to tfjs format.

Note that the SavedModel format exists in keras, but not in
keras-team/keras.
keras-team/tf.keras.

Args:
keras_saved_model_path: path to a folder in which the
Expand Down Expand Up @@ -455,7 +454,7 @@ def get_arg_parser():
help='Input format. '
'For "keras", the input path can be one of the two following formats:\n'
' - A topology+weights combined HDF5 (e.g., generated with'
' `keras.model.save_model()` method).\n'
' `tf.keras.model.save_model()` method).\n'
' - A weights-only HDF5 (e.g., generated with Keras Model\'s '
' `save_weights()` method). \n'
'For "keras_saved_model", the input_path must point to a subfolder '
Expand Down Expand Up @@ -533,7 +532,7 @@ def convert(arguments):
if args.show_version:
print('\ntensorflowjs %s\n' % version.version)
print('Dependency versions:')
print(' keras %s' % keras.__version__)
print(' keras %s' % tf.keras.__version__)
print(' tensorflow %s' % tf.__version__)
return

Expand Down
93 changes: 46 additions & 47 deletions tfjs-converter/python/tensorflowjs/converters/converter_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
# ==============================================================================
"""Unit tests for artifact conversion to and from Python keras."""
"""Unit tests for artifact conversion to and from Python tf.keras."""

from __future__ import absolute_import
from __future__ import division
Expand All @@ -27,7 +27,6 @@

import numpy as np
import tensorflow.compat.v2 as tf
from tensorflow import keras

from tensorflowjs import version
from tensorflowjs.converters import converter
Expand All @@ -50,13 +49,13 @@ def tearDown(self):

def testWeightsOnly(self):
with tf.Graph().as_default(), tf.compat.v1.Session():
input_tensor = keras.layers.Input((3,))
dense1 = keras.layers.Dense(
input_tensor = tf.keras.layers.Input((3,))
dense1 = tf.keras.layers.Dense(
4, use_bias=True, kernel_initializer='ones', bias_initializer='zeros',
name='MyDense1')(input_tensor)
output = keras.layers.Dense(
output = tf.keras.layers.Dense(
2, use_bias=False, kernel_initializer='ones', name='MyDense2')(dense1)
model = keras.models.Model(inputs=[input_tensor], outputs=[output])
model = tf.keras.models.Model(inputs=[input_tensor], outputs=[output])
h5_path = os.path.join(self._tmp_dir, 'MyModel.h5')
model.save_weights(h5_path)

Expand All @@ -80,14 +79,14 @@ def testWeightsOnly(self):

def testConvertSavedKerasModelNoSplitByLayer(self):
with tf.Graph().as_default(), tf.compat.v1.Session():
input_tensor = keras.layers.Input((3,))
dense1 = keras.layers.Dense(
input_tensor = tf.keras.layers.Input((3,))
dense1 = tf.keras.layers.Dense(
4, use_bias=True, kernel_initializer='ones', bias_initializer='zeros',
name='MergedDense1')(input_tensor)
output = keras.layers.Dense(
output = tf.keras.layers.Dense(
2, use_bias=False,
kernel_initializer='ones', name='MergedDense2')(dense1)
model = keras.models.Model(inputs=[input_tensor], outputs=[output])
model = tf.keras.models.Model(inputs=[input_tensor], outputs=[output])
h5_path = os.path.join(self._tmp_dir, 'MyModelMerged.h5')
model.save(h5_path)

Expand All @@ -101,7 +100,7 @@ def testConvertSavedKerasModelNoSplitByLayer(self):
self.assertIn('layers', model_json['model_config']['config'])

# Check the loaded weights.
self.assertEqual(keras.__version__, model_json['keras_version'])
self.assertEqual(tf.keras.__version__, model_json['keras_version'])
self.assertEqual('tensorflow', model_json['backend'])
self.assertEqual(1, len(groups))
self.assertEqual(3, len(groups[0]))
Expand All @@ -116,14 +115,14 @@ def testConvertSavedKerasModelNoSplitByLayer(self):

def testConvertSavedKerasModelSplitByLayer(self):
with tf.Graph().as_default(), tf.compat.v1.Session():
input_tensor = keras.layers.Input((3,))
dense1 = keras.layers.Dense(
input_tensor = tf.keras.layers.Input((3,))
dense1 = tf.keras.layers.Dense(
4, use_bias=True, kernel_initializer='ones', bias_initializer='zeros',
name='MergedDense1')(input_tensor)
output = keras.layers.Dense(
output = tf.keras.layers.Dense(
2, use_bias=False,
kernel_initializer='ones', name='MergedDense2')(dense1)
model = keras.models.Model(inputs=[input_tensor], outputs=[output])
model = tf.keras.models.Model(inputs=[input_tensor], outputs=[output])
h5_path = os.path.join(self._tmp_dir, 'MyModelMerged.h5')
model.save(h5_path)

Expand All @@ -137,7 +136,7 @@ def testConvertSavedKerasModelSplitByLayer(self):
self.assertIn('layers', model_json['model_config']['config'])

# Check the loaded weights.
self.assertEqual(keras.__version__, model_json['keras_version'])
self.assertEqual(tf.keras.__version__, model_json['keras_version'])
self.assertEqual('tensorflow', model_json['backend'])
self.assertEqual(2, len(groups))
self.assertEqual(2, len(groups[0]))
Expand All @@ -153,8 +152,8 @@ def testConvertSavedKerasModelSplitByLayer(self):

def testConvertSavedKerasModeltoTfLayersModelSharded(self):
with tf.Graph().as_default(), tf.compat.v1.Session():
sequential_model = keras.models.Sequential([
keras.layers.Dense(
sequential_model = tf.keras.models.Sequential([
tf.keras.layers.Dense(
3, input_shape=(2,), use_bias=True, kernel_initializer='ones',
name='Dense1')])
h5_path = os.path.join(self._tmp_dir, 'SequentialModel.h5')
Expand Down Expand Up @@ -182,11 +181,11 @@ def testConvertSavedKerasModeltoTfLayersModelSharded(self):

def testConvertWeightsFromSequentialModel(self):
with tf.Graph().as_default(), tf.compat.v1.Session():
sequential_model = keras.models.Sequential([
keras.layers.Dense(
sequential_model = tf.keras.models.Sequential([
tf.keras.layers.Dense(
3, input_shape=(2,), use_bias=True, kernel_initializer='ones',
name='Dense1'),
keras.layers.Dense(
tf.keras.layers.Dense(
1, use_bias=False, kernel_initializer='ones', name='Dense2')])
h5_path = os.path.join(self._tmp_dir, 'SequentialModel.h5')
sequential_model.save_weights(h5_path)
Expand All @@ -212,8 +211,8 @@ def testConvertWeightsFromSequentialModel(self):
def testConvertModelForNonexistentDirCreatesDir(self):
with tf.Graph().as_default(), tf.compat.v1.Session():
output_dir = os.path.join(self._tmp_dir, 'foo_model')
sequential_model = keras.models.Sequential([
keras.layers.Dense(
sequential_model = tf.keras.models.Sequential([
tf.keras.layers.Dense(
3, input_shape=(2,), use_bias=True, kernel_initializer='ones',
name='Dense1')])
h5_path = os.path.join(self._tmp_dir, 'SequentialModel.h5')
Expand All @@ -234,8 +233,8 @@ def testOutpuDirAsAnExistingFileLeadsToValueError(self):
f.write('\n')

with tf.Graph().as_default(), tf.compat.v1.Session():
sequential_model = keras.models.Sequential([
keras.layers.Dense(
sequential_model = tf.keras.models.Sequential([
tf.keras.layers.Dense(
3, input_shape=(2,), use_bias=True, kernel_initializer='ones',
name='Dense1')])
h5_path = os.path.join(self._tmp_dir, 'SequentialModel.h5')
Expand All @@ -248,11 +247,11 @@ def testOutpuDirAsAnExistingFileLeadsToValueError(self):

def testTensorflowjsToKerasConversionSucceeds(self):
with tf.Graph().as_default(), tf.compat.v1.Session():
sequential_model = keras.models.Sequential([
keras.layers.Dense(
sequential_model = tf.keras.models.Sequential([
tf.keras.layers.Dense(
3, input_shape=(2,), use_bias=True, kernel_initializer='ones',
name='Dense1'),
keras.layers.Dense(
tf.keras.layers.Dense(
1, use_bias=False, kernel_initializer='ones', name='Dense2')])
h5_path = os.path.join(self._tmp_dir, 'SequentialModel.h5')
sequential_model.save(h5_path)
Expand All @@ -267,7 +266,7 @@ def testTensorflowjsToKerasConversionSucceeds(self):

# Load the new H5 and compare the model JSONs.
with tf.Graph().as_default(), tf.compat.v1.Session():
new_model = keras.models.load_model(new_h5_path)
new_model = tf.keras.models.load_model(new_h5_path)
self.assertEqual(old_model_json, new_model.to_json())

def testTensorflowjsToKerasConversionFailsOnDirInputPath(self):
Expand All @@ -278,11 +277,11 @@ def testTensorflowjsToKerasConversionFailsOnDirInputPath(self):

def testTensorflowjsToKerasConversionFailsOnExistingDirOutputPath(self):
with tf.Graph().as_default(), tf.compat.v1.Session():
sequential_model = keras.models.Sequential([
keras.layers.Dense(
sequential_model = tf.keras.models.Sequential([
tf.keras.layers.Dense(
3, input_shape=(2,), use_bias=True, kernel_initializer='ones',
name='Dense1'),
keras.layers.Dense(
tf.keras.layers.Dense(
1, use_bias=False, kernel_initializer='ones', name='Dense2')])
h5_path = os.path.join(self._tmp_dir, 'SequentialModel.h5')
sequential_model.save(h5_path)
Expand Down Expand Up @@ -318,8 +317,8 @@ def tearDown(self):

def testConvertKerasModelToTfGraphModel(self):
output_dir = os.path.join(self._tmp_dir, 'foo_model')
sequential_model = keras.models.Sequential([
keras.layers.Dense(
sequential_model = tf.keras.models.Sequential([
tf.keras.layers.Dense(
3, input_shape=(2,), use_bias=True, kernel_initializer='ones',
name='Dense1')])
h5_path = os.path.join(self._tmp_dir, 'SequentialModel.h5')
Expand Down Expand Up @@ -349,8 +348,8 @@ def testConvertKerasModelToTfGraphModel(self):

def testConvertKerasModelToTfGraphModelSharded(self):
output_dir = os.path.join(self._tmp_dir, 'foo_model')
sequential_model = keras.models.Sequential([
keras.layers.Dense(
sequential_model = tf.keras.models.Sequential([
tf.keras.layers.Dense(
3, input_shape=(2,), use_bias=True, kernel_initializer='ones',
name='Dense1')])
h5_path = os.path.join(self._tmp_dir, 'SequentialModel.h5')
Expand Down Expand Up @@ -394,29 +393,29 @@ def tearDown(self):
super(ConvertTfKerasSavedModelTest, self).tearDown()

def _createSimpleSequentialModel(self):
model = keras.Sequential()
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 = tf.keras.Sequential()
model.add(tf.keras.layers.Reshape([2, 3], input_shape=[6]))
model.add(tf.keras.layers.LSTM(10))
model.add(tf.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 = tf.keras.Sequential()
model.add(tf.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):
input1 = keras.Input(shape=[8])
input2 = keras.Input(shape=[10])
y = keras.layers.Concatenate()([input1, input2])
y = keras.layers.Dense(4, activation='softmax')(y)
model = keras.Model([input1, input2], y)
input1 = tf.keras.Input(shape=[8])
input2 = tf.keras.Input(shape=[10])
y = tf.keras.layers.Concatenate()([input1, input2])
y = tf.keras.layers.Dense(4, activation='softmax')(y)
model = tf.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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@

import six
import tensorflow.compat.v2 as tf
from tensorflow import keras

from tensorflowjs import read_weights
from tensorflowjs.converters import keras_h5_conversion
Expand Down Expand Up @@ -60,9 +59,9 @@ def _deserialize_keras_model(model_topology_json,
unique_name_scope = uuid.uuid4().hex if use_unique_name_scope else None
with tf.compat.v1.name_scope(unique_name_scope):
if is_tf_keras:
model = keras.models.model_from_json(json.dumps(model_topology_json))
model = tf.keras.models.model_from_json(json.dumps(model_topology_json))
else:
model = keras.models.model_from_json(json.dumps(model_topology_json))
model = tf.keras.models.model_from_json(json.dumps(model_topology_json))

if weight_entries:
weights_dict = dict()
Expand Down Expand Up @@ -174,7 +173,7 @@ def load_keras_model(config_json_path,
same TensorFlow Graph or Session context. Default: `False`.

Returns:
The loaded instance of `keras.Model`.
The loaded instance of `tf.keras.Model`.

Raises:
TypeError, if the format of the JSON content of `config_json_path` has an
Expand Down
Loading