示例#1
0
  def test_clone_functional_model(self, share_weights):
    if share_weights:
      clone_fn = functools.partial(
          keras.models._clone_functional_model, layer_fn=models.share_weights)
    else:
      clone_fn = keras.models.clone_model

    val_a = np.random.random((10, 4))
    val_b = np.random.random((10, 4))
    val_out = np.random.random((10, 4))

    input_a = keras.Input(shape=(4,))
    input_b = keras.Input(shape=(4,))
    dense_1 = keras.layers.Dense(4,)
    dense_2 = keras.layers.Dense(4,)

    x_a = dense_1(input_a)
    x_a = keras.layers.Dropout(0.5)(x_a)
    x_a = keras.layers.BatchNormalization()(x_a)
    x_b = dense_1(input_b)
    x_a = dense_2(x_a)
    outputs = keras.layers.add([x_a, x_b])
    model = keras.models.Model([input_a, input_b], outputs)

    # With placeholder creation
    new_model = clone_fn(model)
    self.assertGreaterEqual(len(new_model.updates), 2)
    new_model.compile(
        testing_utils.get_v2_optimizer('rmsprop'),
        'mse',
        run_eagerly=testing_utils.should_run_eagerly())
    new_model.train_on_batch([val_a, val_b], val_out)

    # On top of new tensors
    input_a = keras.Input(shape=(4,), name='a')
    input_b = keras.Input(shape=(4,), name='b')
    new_model = keras.models.clone_model(
        model, input_tensors=[input_a, input_b])
    self.assertLen(new_model.updates, 2)
    new_model.compile(
        testing_utils.get_v2_optimizer('rmsprop'),
        'mse',
        run_eagerly=testing_utils.should_run_eagerly())
    new_model.train_on_batch([val_a, val_b], val_out)

    # On top of new, non-Keras tensors
    if not context.executing_eagerly():
      # TODO(b/121277734):Skip Eager contexts, as Input() layers raise an error
      # saying they should not be used with EagerTensors
      input_a = keras.backend.variable(val_a)
      input_b = keras.backend.variable(val_b)
      new_model = clone_fn(model, input_tensors=[input_a, input_b])
      self.assertGreaterEqual(len(new_model.updates), 2)
      new_model.compile(
          testing_utils.get_v2_optimizer('rmsprop'),
          'mse',
          run_eagerly=testing_utils.should_run_eagerly())
      new_model.train_on_batch(None, val_out)
示例#2
0
  def test_clone_functional_model(self, share_weights):
    if share_weights:
      clone_fn = functools.partial(
          keras.models._clone_functional_model, share_weights=True)
    else:
      clone_fn = keras.models.clone_model

    val_a = np.random.random((10, 4))
    val_b = np.random.random((10, 4))
    val_out = np.random.random((10, 4))

    input_a = keras.Input(shape=(4,))
    input_b = keras.Input(shape=(4,))
    dense_1 = keras.layers.Dense(4,)
    dense_2 = keras.layers.Dense(4,)

    x_a = dense_1(input_a)
    x_a = keras.layers.Dropout(0.5)(x_a)
    x_a = keras.layers.BatchNormalization()(x_a)
    x_b = dense_1(input_b)
    x_a = dense_2(x_a)
    outputs = keras.layers.add([x_a, x_b])
    model = keras.models.Model([input_a, input_b], outputs)

    # With placeholder creation
    new_model = clone_fn(model)
    self.assertEqual(len(new_model.get_updates_for(new_model.inputs)), 2)
    new_model.compile(
        testing_utils.get_v2_optimizer('rmsprop'), 'mse',
        run_eagerly=testing_utils.should_run_eagerly())
    new_model.train_on_batch([val_a, val_b], val_out)

    # On top of new tensors
    input_a = keras.Input(shape=(4,), name='a')
    input_b = keras.Input(shape=(4,), name='b')
    new_model = keras.models.clone_model(
        model, input_tensors=[input_a, input_b])
    self.assertEqual(len(new_model.get_updates_for(new_model.inputs)), 2)
    new_model.compile(
        testing_utils.get_v2_optimizer('rmsprop'), 'mse',
        run_eagerly=testing_utils.should_run_eagerly())
    new_model.train_on_batch([val_a, val_b], val_out)

    # On top of new, non-Keras tensors
    if not context.executing_eagerly():
      # TODO(b/121277734):Skip Eager contexts, as Input() layers raise an error
      # saying they should not be used with EagerTensors
      input_a = keras.backend.variable(val_a)
      input_b = keras.backend.variable(val_b)
      new_model = clone_fn(model, input_tensors=[input_a, input_b])
      self.assertEqual(len(new_model.get_updates_for(new_model.inputs)), 2)
      new_model.compile(
          testing_utils.get_v2_optimizer('rmsprop'), 'mse',
          run_eagerly=testing_utils.should_run_eagerly())
      new_model.train_on_batch(None, val_out)
示例#3
0
  def test_clone_and_build_compiled(self):
    model = _get_model()
    model.compile(
        testing_utils.get_v2_optimizer('rmsprop'), 'mse',
        metrics=['acc', metrics.categorical_accuracy],
        run_eagerly=testing_utils.should_run_eagerly())

    self._clone_and_build_test_helper(model, testing_utils.get_model_type())
  def test_clone_and_build_compiled(self):
    model = _get_model()
    model.compile(
        testing_utils.get_v2_optimizer('rmsprop'), 'mse',
        metrics=['acc', metrics.categorical_accuracy],
        run_eagerly=testing_utils.should_run_eagerly())

    self._clone_and_build_test_helper(model, testing_utils.get_model_type())
示例#5
0
    def test_clone_and_build_non_compiled_model(self):
        inp = np.random.random((10, 4))
        out = np.random.random((10, 4))

        model = _get_model()

        with self.assertRaisesRegexp(ValueError, 'has not been compiled'):
            models.clone_and_build_model(model, compile_clone=True)

        is_subclassed = (testing_utils.get_model_type() == 'subclass')
        # With placeholder creation
        new_model = models.clone_and_build_model(model,
                                                 compile_clone=False,
                                                 in_place_reset=is_subclassed)
        with self.assertRaisesRegexp(RuntimeError, 'must compile'):
            new_model.evaluate(inp, out)
        with self.assertRaisesRegexp(RuntimeError, 'must compile'):
            new_model.train_on_batch(inp, out)
        new_model.compile(
            testing_utils.get_v2_optimizer('rmsprop'),
            'mse',
            run_eagerly=testing_utils.should_run_eagerly(),
            run_distributed=testing_utils.should_run_distributed())
        new_model.train_on_batch(inp, out)

        # Create new tensors for inputs and targets
        input_a = keras.Input(shape=(4, ))
        target_a = keras.Input(shape=(4, ))
        new_model = models.clone_and_build_model(model,
                                                 input_tensors=input_a,
                                                 target_tensors=[target_a],
                                                 compile_clone=False,
                                                 in_place_reset=is_subclassed)
        with self.assertRaisesRegexp(RuntimeError, 'must compile'):
            new_model.evaluate(inp, out)
        with self.assertRaisesRegexp(RuntimeError, 'must compile'):
            new_model.train_on_batch(inp, out)
        new_model.compile(
            testing_utils.get_v2_optimizer('rmsprop'),
            'mse',
            run_eagerly=testing_utils.should_run_eagerly(),
            run_distributed=testing_utils.should_run_distributed())
        new_model.train_on_batch(inp, out)
示例#6
0
  def test_clone_and_build_sequential_without_inputs_defined(self):
    model = models.Sequential(_get_layers(input_shape=None))
    model.compile(
        testing_utils.get_v2_optimizer('rmsprop'),
        'mse', metrics=['acc', metrics.categorical_accuracy],
        run_eagerly=testing_utils.should_run_eagerly())
    self._clone_and_build_test_helper(model, 'sequential')

    inp = np.random.random((10, 4))
    out = np.random.random((10, 4))
    model.train_on_batch(inp, out)
    self._clone_and_build_test_helper(model, 'sequential')
    def test_clone_and_build_sequential_without_inputs_defined(self):
        model = models.Sequential(_get_layers(input_shape=None))
        model.compile(testing_utils.get_v2_optimizer('rmsprop'),
                      'mse',
                      metrics=['acc', metrics.categorical_accuracy],
                      run_eagerly=testing_utils.should_run_eagerly())
        self._clone_and_build_test_helper(model, 'sequential')

        inp = np.random.random((10, 4))
        out = np.random.random((10, 4))
        model.train_on_batch(inp, out)
        self._clone_and_build_test_helper(model, 'sequential')
示例#8
0
  def test_model_backend_float64_use_cases(self):
    # Test case for GitHub issue 19318
    floatx = keras.backend.floatx()
    keras.backend.set_floatx('float64')

    x = keras.Input((5,))
    y = keras.layers.Dense(1)(x)
    model = keras.models.Model(x, y)
    model.compile(
        testing_utils.get_v2_optimizer('rmsprop'), 'mse',
        run_eagerly=testing_utils.should_run_eagerly())

    keras.backend.set_floatx(floatx)
    def test_model_backend_float64_use_cases(self):
        # Test case for GitHub issue 19318
        floatx = keras.backend.floatx()
        keras.backend.set_floatx('float64')

        x = keras.Input((5, ))
        y = keras.layers.Dense(1)(x)
        model = keras.models.Model(x, y)
        model.compile(testing_utils.get_v2_optimizer('rmsprop'),
                      'mse',
                      run_eagerly=testing_utils.should_run_eagerly())

        keras.backend.set_floatx(floatx)
示例#10
0
  def test_clone_and_build_non_compiled_model(self):
    inp = np.random.random((10, 4))
    out = np.random.random((10, 4))

    model = _get_model()

    with self.assertRaisesRegexp(ValueError, 'has not been compiled'):
      models.clone_and_build_model(model, compile_clone=True)

    is_subclassed = (testing_utils.get_model_type() == 'subclass')
    # With placeholder creation
    new_model = models.clone_and_build_model(
        model, compile_clone=False, in_place_reset=is_subclassed)
    with self.assertRaisesRegexp(RuntimeError, 'must compile'):
      new_model.evaluate(inp, out)
    with self.assertRaisesRegexp(RuntimeError, 'must compile'):
      new_model.train_on_batch(inp, out)
    new_model.compile(
        testing_utils.get_v2_optimizer('rmsprop'), 'mse',
        run_eagerly=testing_utils.should_run_eagerly())
    new_model.train_on_batch(inp, out)

    # Create new tensors for inputs and targets
    input_a = keras.Input(shape=(4,))
    target_a = keras.Input(shape=(4,))
    new_model = models.clone_and_build_model(
        model, input_tensors=input_a, target_tensors=[target_a],
        compile_clone=False, in_place_reset=is_subclassed)
    with self.assertRaisesRegexp(RuntimeError, 'must compile'):
      new_model.evaluate(inp, out)
    with self.assertRaisesRegexp(RuntimeError, 'must compile'):
      new_model.train_on_batch(inp, out)
    new_model.compile(
        testing_utils.get_v2_optimizer('rmsprop'), 'mse',
        run_eagerly=testing_utils.should_run_eagerly())
    new_model.train_on_batch(inp, out)
示例#11
0
  def test_clone_functional_with_masking(self, share_weights):
    if share_weights:
      clone_fn = functools.partial(
          keras.models._clone_functional_model, share_weights=True)
    else:
      clone_fn = keras.models.clone_model

    x = np.array([[[1.], [1.]], [[0.], [0.]]])
    inputs = keras.Input((2, 1))
    outputs = keras.layers.Masking(mask_value=0)(inputs)
    outputs = keras.layers.TimeDistributed(
        keras.layers.Dense(1, kernel_initializer='one'))(outputs)
    model = keras.Model(inputs, outputs)

    model = clone_fn(model)
    model.compile(
        loss='mse', optimizer=testing_utils.get_v2_optimizer('adam'),
        run_eagerly=testing_utils.should_run_eagerly())
    y = np.array([[[1], [1]], [[1], [1]]])
    loss = model.train_on_batch(x, y)
    self.assertEqual(float(loss), 0.)
    def test_clone_functional_with_masking(self, share_weights):
        if share_weights:
            clone_fn = functools.partial(keras.models._clone_functional_model,
                                         layer_fn=models.share_weights)
        else:
            clone_fn = keras.models.clone_model

        x = np.array([[[1.], [1.]], [[0.], [0.]]])
        inputs = keras.Input((2, 1))
        outputs = keras.layers.Masking(mask_value=0)(inputs)
        outputs = keras.layers.TimeDistributed(
            keras.layers.Dense(1, kernel_initializer='one'))(outputs)
        model = keras.Model(inputs, outputs)

        model = clone_fn(model)
        model.compile(loss='mse',
                      optimizer=testing_utils.get_v2_optimizer('adam'),
                      run_eagerly=testing_utils.should_run_eagerly())
        y = np.array([[[1], [1]], [[1], [1]]])
        loss = model.train_on_batch(x, y)
        self.assertEqual(float(loss), 0.)