예제 #1
0
    def test_compiled_model(self):
        input_arr = np.random.random((1, 3))
        target_arr = np.random.random((1, 4))

        model = testing_utils.get_small_mlp(1, 4, input_dim=3)
        expected_predict = model.predict(input_arr)

        # Compile and save model.
        model.compile('rmsprop', 'mse')
        saved_model_dir = self._save_model_dir()
        tf_save.save(model, saved_model_dir)

        # TODO(b/134519980): Issue with model.fit if the model call function uses
        # a tf.function (Graph mode only).
        with context.eager_mode():
            loaded = keras_saved_model.load_from_saved_model_v2(
                saved_model_dir)
            actual_predict = loaded.predict(input_arr)
            self.assertAllClose(expected_predict, actual_predict)

            loss_before = loaded.evaluate(input_arr, target_arr)
            loaded.fit(input_arr, target_arr)
            loss_after = loaded.evaluate(input_arr, target_arr)
            self.assertLess(loss_after, loss_before)
            predict = loaded.predict(input_arr)

            ckpt_path = os.path.join(self.get_temp_dir(), 'weights')
            loaded.save_weights(ckpt_path)

        # Ensure that the checkpoint is compatible with the original model.
        model.load_weights(ckpt_path)
        self.assertAllClose(predict, model.predict(input_arr))
예제 #2
0
    def test_trainable_weights(self):
        layer = keras.layers.Dense(4, name='custom_layer')
        layer.build([
            3,
        ])
        layer.add_weight('extra_weight',
                         shape=[],
                         initializer=init_ops.constant_initializer(11),
                         trainable=True)
        layer.add_weight('extra_weight_2',
                         shape=[],
                         initializer=init_ops.constant_initializer(12),
                         trainable=False)

        saved_model_dir = self._save_model_dir()
        self.evaluate(variables.variables_initializer(layer.variables))
        tf_save.save(layer, saved_model_dir)
        loaded = keras_saved_model.load_from_saved_model_v2(saved_model_dir)
        self.evaluate(variables.variables_initializer(loaded.variables))

        equal_attrs = ['name', '_expects_training_arg', 'trainable']
        for attr in equal_attrs:
            self.assertEqual(getattr(layer, attr), getattr(loaded, attr))

        all_close = ['weights', 'trainable_weights', 'non_trainable_weights']
        for attr in all_close:
            self.assertAllClose(self.evaluate(getattr(layer, attr)),
                                self.evaluate(getattr(loaded, attr)))
예제 #3
0
    def test_revived_sequential(self):
        model = keras.models.Sequential()
        model.add(
            keras.layers.Dense(5,
                               input_shape=(3, ),
                               kernel_regularizer=regularizers.get('l2')))
        model.add(
            keras.layers.Dense(2, kernel_regularizer=regularizers.get('l2')))

        self.evaluate(variables.variables_initializer(model.variables))

        saved_model_dir = self._save_model_dir()
        model.save(saved_model_dir, save_format='tf')
        loaded = keras_saved_model.load_from_saved_model_v2(saved_model_dir)

        self.assertLen(loaded.layers, 2)
        self.assertLen(loaded.losses, 2)

        loaded.pop()

        self.assertLen(loaded.layers, 1)
        self.assertLen(loaded.losses, 1)

        loaded.add(
            keras.layers.Dense(2, kernel_regularizer=regularizers.get('l2')))

        self.assertLen(loaded.layers, 2)
        self.assertLen(loaded.losses, 2)
예제 #4
0
    def test_multi_input_model(self):
        input_1 = keras.layers.Input(shape=(3, ))
        input_2 = keras.layers.Input(shape=(5, ))
        model = keras.Model([input_1, input_2], [input_1, input_2])
        saved_model_dir = self._save_model_dir()

        model.save(saved_model_dir, save_format='tf')
        loaded = keras_saved_model.load_from_saved_model_v2(saved_model_dir)
        input_arr_1 = np.random.random((1, 3)).astype('float32')
        input_arr_2 = np.random.random((1, 5)).astype('float32')

        outputs = loaded([input_arr_1, input_arr_2])
        self.assertAllEqual(input_arr_1, outputs[0])
        self.assertAllEqual(input_arr_2, outputs[1])
예제 #5
0
    def test_metadata_input_spec(self):
        class LayerWithNestedSpec(keras.layers.Layer):
            def __init__(self):
                super(LayerWithNestedSpec, self).__init__()
                self.input_spec = {
                    'a':
                    keras.layers.InputSpec(max_ndim=3, axes={-1: 2}),
                    'b':
                    keras.layers.InputSpec(shape=(None, 2, 3), dtype='float16')
                }

        layer = LayerWithNestedSpec()
        saved_model_dir = self._save_model_dir()
        tf_save.save(layer, saved_model_dir)
        loaded = keras_saved_model.load_from_saved_model_v2(saved_model_dir)
        self.assertEqual(3, loaded.input_spec['a'].max_ndim)
        self.assertEqual({-1: 2}, loaded.input_spec['a'].axes)
        self.assertAllEqual([None, 2, 3], loaded.input_spec['b'].shape)
        self.assertEqual('float16', loaded.input_spec['b'].dtype)
예제 #6
0
    def test_layer_with_learning_phase(self):
        layer = LayerWithLearningPhase()
        layer.build([None, None])
        saved_model_dir = self._save_model_dir()
        tf_save.save(layer, saved_model_dir)
        loaded = keras_saved_model.load_from_saved_model_v2(saved_model_dir)
        input_arr = array_ops.ones((4, 3))

        # Run the layer, and use the keras backend learing phase
        keras.backend.set_learning_phase(0)
        self.assertAllEqual(input_arr, loaded(input_arr))
        keras.backend.set_learning_phase(1)
        self.assertAllEqual(array_ops.zeros((4, 3)), loaded(input_arr))

        # Run the layer while explicitly setting the training argument
        self.assertAllEqual(
            input_arr, loaded(input_arr, training=constant_op.constant(False)))
        self.assertAllEqual(
            array_ops.zeros((4, 3)),
            loaded(input_arr, training=constant_op.constant(True)))
예제 #7
0
def load_model(filepath, custom_objects=None, compile=True):  # pylint: disable=redefined-builtin
    """Loads a model saved via `save_model`.

  Arguments:
      filepath: One of the following:
          - String, path to the saved model
          - `h5py.File` object from which to load the model
      custom_objects: Optional dictionary mapping names
          (strings) to custom classes or functions to be
          considered during deserialization.
      compile: Boolean, whether to compile the model
          after loading.

  Returns:
      A Keras model instance. If an optimizer was found
      as part of the saved model, the model is already
      compiled. Otherwise, the model is uncompiled and
      a warning will be displayed. When `compile` is set
      to False, the compilation is omitted without any
      warning.

  Raises:
      ImportError: if loading from an hdf5 file and h5py is not available.
      IOError: In case of an invalid savefile.
  """
    if not tf2.enabled() or (h5py is not None and
                             (isinstance(filepath, h5py.File)
                              or h5py.is_hdf5(filepath))):
        return hdf5_format.load_model_from_hdf5(filepath, custom_objects,
                                                compile)

    if isinstance(filepath, six.string_types):
        loader_impl.parse_saved_model(filepath)
        return saved_model.load_from_saved_model_v2(filepath)

    raise IOError(
        'Unable to load model. Filepath is not an hdf5 file (or h5py is not '
        'available) or SavedModel.')
예제 #8
0
  def test_model_save_and_load(self):
    input_arr = np.random.random((1, 3)).astype(np.float32)
    target_arr = np.random.random((1, 4)).astype(np.float32)

    model = testing_utils.get_small_mlp(1, 4, input_dim=3)
    model.layers[-1].activity_regularizer = regularizers.get('l2')
    model.activity_regularizer = regularizers.get('l2')
    model.compile(
        loss='mse',
        optimizer='rmsprop')
    model.train_on_batch(input_arr, target_arr)

    def callable_loss():
      return math_ops.reduce_sum(model.weights[0])
    model.add_loss(callable_loss)
    saved_model_dir = self._save_model_dir()
    tf_save.save(model, saved_model_dir)

    loaded = keras_saved_model.load_from_saved_model_v2(saved_model_dir)
    self.evaluate(variables.variables_initializer(loaded.variables))
    self.assertAllClose(self.evaluate(model.weights),
                        self.evaluate(loaded.weights))

    input_arr = constant_op.constant(
        np.random.random((1, 3)).astype(np.float32))
    self.assertAllClose(self.evaluate(model(input_arr)),
                        self.evaluate(loaded(input_arr)))
    # Validate losses. The order of conditional losses may change between the
    # model and loaded model, so sort the losses first.
    if context.executing_eagerly():
      self.assertAllClose(sorted(self.evaluate(model.losses)),
                          sorted(self.evaluate(loaded.losses)))
    else:
      self.assertAllClose(self.evaluate(model.get_losses_for(None)),
                          self.evaluate(loaded.get_losses_for(None)))
      self.assertAllClose(
          sorted(self.evaluate(model.get_losses_for(input_arr))),
          sorted(self.evaluate(loaded.get_losses_for(input_arr))))