def testTopologicalAttributesMultiInputLayer(self):
        class AddLayer(keras.layers.Layer):
            def call(self, inputs):
                assert len(inputs) == 2
                return inputs[0] + inputs[1]

        a = keras.Input(shape=(32, ))
        b = keras.Input(shape=(32, ))
        test_layer = AddLayer()
        y = test_layer([a, b])  # pylint: disable=not-callable

        self.assertEqual(test_layer.input, [a, b])
        self.assertEqual(test_layer.output, y)
        self.assertEqual(test_layer.input_shape, [(None, 32), (None, 32)])
        self.assertEqual(test_layer.output_shape, (None, 32))
Пример #2
0
def get_functional_graph_model(input_dim, num_classes):
  # A simple functional-API model (a.k.a. graph network)
  inputs = keras.Input(shape=(input_dim,))
  x = keras.layers.Dense(32, activation='relu')(inputs)
  x = keras.layers.BatchNormalization()(x)
  outputs = keras.layers.Dense(num_classes)(x)
  return keras.Model(inputs, outputs)
Пример #3
0
 def test_is_keras_tensor(self):
   x = keras.backend.variable(1)
   self.assertEqual(keras.backend.is_keras_tensor(x), False)
   x = keras.Input(shape=(1,))
   self.assertEqual(keras.backend.is_keras_tensor(x), True)
   with self.assertRaises(ValueError):
     keras.backend.is_keras_tensor(0)
Пример #4
0
def get_nested_model_3(input_dim, num_classes):
  # A functional-API model with a subclassed model inside.
  # NOTE: this requires the inner subclass to implement `compute_output_shape`.

  inputs = keras.Input(shape=(input_dim,))
  x = keras.layers.Dense(32, activation='relu')(inputs)
  x = keras.layers.BatchNormalization()(x)

  class Inner(keras.Model):

    def __init__(self):
      super(Inner, self).__init__()
      self.dense1 = keras.layers.Dense(32, activation='relu')
      self.dense2 = keras.layers.Dense(5, activation='relu')
      self.bn = keras.layers.BatchNormalization()

    def call(self, inputs):
      x = self.dense1(inputs)
      x = self.dense2(x)
      return self.bn(x)

    def compute_output_shape(self, input_shape):
      return tensor_shape.TensorShape((input_shape[0], 5))

  test_model = Inner()
  x = test_model(x)  # pylint: disable=not-callable
  outputs = keras.layers.Dense(num_classes)(x)
  return keras.Model(inputs, outputs, name='nested_model_3')
Пример #5
0
    def test_minimal_rnn_cell_non_layer(self):
        class MinimalRNNCell(object):
            def __init__(self, units, input_dim):
                self.units = units
                self.state_size = units
                self.kernel = keras.backend.variable(
                    np.random.random((input_dim, units)))

            def call(self, inputs, states):
                prev_output = states[0]
                output = keras.backend.dot(inputs, self.kernel) + prev_output
                return output, [output]

        with self.test_session():
            # Basic test case.
            cell = MinimalRNNCell(32, 5)
            x = keras.Input((None, 5))
            layer = keras.layers.RNN(cell)
            y = layer(x)
            model = keras.models.Model(x, y)
            model.compile(optimizer='rmsprop', loss='mse')
            model.train_on_batch(np.zeros((6, 5, 5)), np.zeros((6, 32)))

            # Test stacking.
            cells = [
                MinimalRNNCell(8, 5),
                MinimalRNNCell(32, 8),
                MinimalRNNCell(32, 32)
            ]
            layer = keras.layers.RNN(cells)
            y = layer(x)
            model = keras.models.Model(x, y)
            model.compile(optimizer='rmsprop', loss='mse')
            model.train_on_batch(np.zeros((6, 5, 5)), np.zeros((6, 32)))
Пример #6
0
    def test_using_tf_layers_in_keras_functional_model(self):
        with self.test_session():
            np.random.seed(1337)
            (x_train, y_train), (x_test, y_test) = testing_utils.get_test_data(
                train_samples=200,
                test_samples=100,
                input_shape=(10, ),
                num_classes=2)
            y_train = keras.utils.to_categorical(y_train)
            y_test = keras.utils.to_categorical(y_test)

            inputs = keras.Input(shape=(10, ))
            x = tf_core_layers.Dense(32, activation=nn.relu)(inputs)
            outputs = tf_core_layers.Dense(2, activation=nn.softmax)(x)
            model = keras.Model(inputs, outputs)
            model.summary()

            model.compile(loss='categorical_crossentropy',
                          optimizer='adam',
                          metrics=['accuracy'])
            history = model.fit(x_train,
                                y_train,
                                epochs=10,
                                batch_size=16,
                                validation_data=(x_test, y_test),
                                verbose=0)
            self.assertGreater(history.history['val_acc'][-1], 0.85)
Пример #7
0
    def test_Bidirectional_state_reuse(self):
        rnn = keras.layers.LSTM
        samples = 2
        dim = 5
        timesteps = 3
        units = 3

        with self.test_session():
            inputs = keras.Input((timesteps, dim))
            layer = keras.layers.Bidirectional(
                rnn(units, return_state=True, return_sequences=True))
            outputs = layer(inputs)
            output, state = outputs[0], outputs[1:]

            # test passing invalid initial_state: passing a tensor
            with self.assertRaises(ValueError):
                output = keras.layers.Bidirectional(rnn(units))(
                    output, initial_state=state[0])

            # test valid usage: passing a list
            output = keras.layers.Bidirectional(rnn(units))(
                output, initial_state=state)
            model = keras.Model(inputs, output)
            inputs = np.random.rand(samples, timesteps, dim)
            outputs = model.predict(inputs)
Пример #8
0
    def test_clone_sequential_model(self):
        with self.test_session():
            val_a = np.random.random((10, 4))
            val_out = np.random.random((10, 4))

            model = keras.models.Sequential()
            model.add(keras.layers.Dense(4, input_shape=(4, )))
            model.add(keras.layers.Dropout(0.5))
            model.add(keras.layers.Dense(4))

        # Everything should work in a new session.
        keras.backend.clear_session()

        with self.test_session():
            # With placeholder creation
            new_model = keras.models.clone_model(model)
            new_model.compile('rmsprop', 'mse')
            new_model.train_on_batch(val_a, val_out)

            # On top of new tensor
            input_a = keras.Input(shape=(4, ))
            new_model = keras.models.clone_model(model, input_tensors=input_a)
            new_model.compile('rmsprop', 'mse')
            new_model.train_on_batch(val_a, val_out)

            # On top of new, non-Keras tensor
            input_a = keras.backend.variable(val_a)
            new_model = keras.models.clone_model(model, input_tensors=input_a)
            new_model.compile('rmsprop', 'mse')
            new_model.train_on_batch(None, val_out)
Пример #9
0
    def test_layer_sharing_at_heterogenous_depth_with_concat(self):
        with self.test_session():
            input_shape = (16, 9, 3)
            input_layer = keras.Input(shape=input_shape)

            a = keras.layers.Dense(3, name='dense_A')
            b = keras.layers.Dense(3, name='dense_B')
            c = keras.layers.Dense(3, name='dense_C')

            x1 = b(a(input_layer))
            x2 = a(c(input_layer))
            output = keras.layers.concatenate([x1, x2])

            m = keras.models.Model(inputs=input_layer, outputs=output)

            x_val = np.random.random((10, 16, 9, 3))
            output_val = m.predict(x_val)

            config = m.get_config()
            weights = m.get_weights()

            m2 = keras.models.Model.from_config(config)
            m2.set_weights(weights)

            output_val_2 = m2.predict(x_val)
            self.assertAllClose(output_val, output_val_2, atol=1e-6)
Пример #10
0
    def test_get_updates_bn(self):
        x1 = keras.Input(shape=(1, ))
        layer = keras.layers.BatchNormalization()
        _ = layer.apply(x1)

        print('BN updates', layer._updates)
        self.assertEqual(len(layer.updates), 2)
        self.assertEqual(len(layer.get_updates_for(x1)), 2)
        self.assertEqual(len(layer.get_updates_for(None)), 0)
  def test_saving_model_with_long_weights_names(self):
    if h5py is None:
      return  # Skip test if models cannot be saved.

    with self.test_session():
      x = keras.Input(shape=(2,), name='nested_model_input')
      f = x
      for i in range(4):
        f = keras.layers.Dense(2, name='nested_model_dense_%d' % (i,))(f)
      # This layer name will make the `weights_name`
      # HDF5 attribute blow out of proportion.
      f = keras.layers.Dense(2, name='nested_model_output' + ('x' * (2**14)))(f)
      nested_model = keras.Model(inputs=[x], outputs=[f], name='nested_model')

      x = keras.Input(shape=(2,), name='outer_model_input')
      f = nested_model(x)
      f = keras.layers.Dense(2, name='outer_model_output')(f)

      model = keras.Model(inputs=[x], outputs=[f])
      model.compile(loss='mse', optimizer='adam', metrics=['acc'])

      x = np.random.random((1, 2))
      y = np.random.random((1, 2))
      model.train_on_batch(x, y)
      out = model.predict(x)

      fd, fname = tempfile.mkstemp('.h5')
      keras.models.save_model(model, fname)
      model = keras.models.load_model(fname)

      # Check that the HDF5 files contains chunked array
      # of weight names.
      with h5py.File(fname, 'r') as h5file:
        num_weight_arrays = len(
            [attr for attr in h5file['model_weights']['nested_model'].attrs
             if attr.startswith('weight_names')])
      # The chunking of layer names array should have happend.
      self.assertGreater(num_weight_arrays, 0)
      out2 = model.predict(x)
      self.assertAllClose(out, out2, atol=1e-05)

      # Cleanup
      os.close(fd)
      os.remove(fname)
    def test_conv_lstm(self):
        num_row = 3
        num_col = 3
        filters = 2
        num_samples = 1
        input_channel = 2
        input_num_row = 5
        input_num_col = 5
        sequence_len = 2
        for data_format in ['channels_first', 'channels_last']:
            if data_format == 'channels_first':
                inputs = np.random.rand(num_samples, sequence_len,
                                        input_channel, input_num_row,
                                        input_num_col)
            else:
                inputs = np.random.rand(num_samples, sequence_len,
                                        input_num_row, input_num_col,
                                        input_channel)

            for return_sequences in [True, False]:
                with self.test_session():
                    # test for return state:
                    x = keras.Input(batch_shape=inputs.shape)
                    kwargs = {
                        'data_format': data_format,
                        'return_sequences': return_sequences,
                        'return_state': True,
                        'stateful': True,
                        'filters': filters,
                        'kernel_size': (num_row, num_col),
                        'padding': 'valid'
                    }
                    layer = keras.layers.ConvLSTM2D(**kwargs)
                    layer.build(inputs.shape)
                    outputs = layer(x)
                    _, states = outputs[0], outputs[1:]
                    self.assertEqual(len(states), 2)
                    model = keras.models.Model(x, states[0])
                    state = model.predict(inputs)

                    self.assertAllClose(keras.backend.eval(layer.states[0]),
                                        state,
                                        atol=1e-4)

                    # test for output shape:
                    testing_utils.layer_test(keras.layers.ConvLSTM2D,
                                             kwargs={
                                                 'data_format': data_format,
                                                 'return_sequences':
                                                 return_sequences,
                                                 'filters': filters,
                                                 'kernel_size':
                                                 (num_row, num_col),
                                                 'padding': 'valid'
                                             },
                                             input_shape=inputs.shape)
Пример #13
0
    def test_clone_functional_model(self):
        with self.test_session():
            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_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)

        # Everything should work in a new session.
        keras.backend.clear_session()

        with self.test_session():
            # With placeholder creation
            new_model = keras.models.clone_model(model)
            new_model.compile('rmsprop', 'mse')
            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])
            new_model.compile('rmsprop', 'mse')
            new_model.train_on_batch([val_a, val_b], val_out)

            # On top of new, non-Keras tensors
            input_a = keras.backend.variable(val_a)
            input_b = keras.backend.variable(val_b)
            new_model = keras.models.clone_model(
                model, input_tensors=[input_a, input_b])
            new_model.compile('rmsprop', 'mse')
            new_model.train_on_batch(None, val_out)
Пример #14
0
    def test_activity_regularization_with_model_composition(self):
        def reg(x):
            return keras.backend.sum(x)

        net_a_input = keras.Input((2, ))
        net_a = net_a_input
        net_a = keras.layers.Dense(2,
                                   kernel_initializer='ones',
                                   use_bias=False,
                                   activity_regularizer=reg)(net_a)
        model_a = keras.Model([net_a_input], [net_a])

        net_b_input = keras.Input((2, ))
        net_b = model_a(net_b_input)
        model_b = keras.Model([net_b_input], [net_b])

        model_b.compile(optimizer='sgd', loss=None)
        x = np.ones((1, 2))
        loss = model_b.evaluate(x)
        self.assertEqual(loss, 4.)
Пример #15
0
  def test_specify_state_with_masking(self):
    num_states = 2
    timesteps = 3
    embedding_dim = 4
    units = 3
    num_samples = 2

    with self.test_session():
      inputs = keras.Input((timesteps, embedding_dim))
      _ = keras.layers.Masking()(inputs)
      initial_state = [keras.Input((units,)) for _ in range(num_states)]
      output = keras.layers.LSTM(units)(inputs, initial_state=initial_state)

      model = keras.models.Model([inputs] + initial_state, output)
      model.compile(loss='categorical_crossentropy', optimizer='adam')

      inputs = np.random.random((num_samples, timesteps, embedding_dim))
      initial_state = [np.random.random((num_samples, units))
                       for _ in range(num_states)]
      targets = np.random.random((num_samples, units))
      model.train_on_batch([inputs] + initial_state, targets)
Пример #16
0
    def test_Bidirectional_with_constants(self):
        with self.test_session():
            # Test basic case.
            x = keras.Input((5, 5))
            c = keras.Input((3, ))
            cell = _RNNCellWithConstants(32)
            custom_objects = {'_RNNCellWithConstants': _RNNCellWithConstants}
            with keras.utils.CustomObjectScope(custom_objects):
                layer = keras.layers.Bidirectional(keras.layers.RNN(cell))
            y = layer(x, constants=c)
            model = keras.Model([x, c], y)
            model.compile(optimizer='rmsprop', loss='mse')
            model.train_on_batch([np.zeros(
                (6, 5, 5)), np.zeros((6, 3))], np.zeros((6, 64)))

            # Test basic case serialization.
            x_np = np.random.random((6, 5, 5))
            c_np = np.random.random((6, 3))
            y_np = model.predict([x_np, c_np])
            weights = model.get_weights()
            config = layer.get_config()

            with keras.utils.CustomObjectScope(custom_objects):
                layer = keras.layers.Bidirectional.from_config(
                    copy.deepcopy(config))
            y = layer(x, constants=c)
            model = keras.Model([x, c], y)
            model.set_weights(weights)
            y_np_2 = model.predict([x_np, c_np])
            self.assertAllClose(y_np, y_np_2, atol=1e-4)

            # Test flat list inputs
            with keras.utils.CustomObjectScope(custom_objects):
                layer = keras.layers.Bidirectional.from_config(
                    copy.deepcopy(config))
            y = layer([x, c])
            model = keras.Model([x, c], y)
            model.set_weights(weights)
            y_np_3 = model.predict([x_np, c_np])
            self.assertAllClose(y_np, y_np_3, atol=1e-4)
Пример #17
0
  def test_learning_phase(self):
    with self.test_session() as sess:
      keras.backend.set_learning_phase(1)
      self.assertEqual(keras.backend.learning_phase(), 1)
      with self.assertRaises(ValueError):
        keras.backend.set_learning_phase(2)

      # Test running with a learning-phase-consuming layer
      keras.backend.set_learning_phase(0)
      x = keras.Input((3,))
      y = keras.layers.BatchNormalization()(x)
      sess.run(variables.global_variables_initializer())
      sess.run(y, feed_dict={x: np.random.random((2, 3))})
Пример #18
0
  def test_state_reuse_with_dropout(self):
    layer_class = keras.layers.SimpleRNN
    embedding_dim = 4
    units = 3
    timesteps = 2
    num_samples = 2

    with self.test_session():
      input1 = keras.Input(batch_shape=(num_samples, timesteps, embedding_dim))
      layer = layer_class(units,
                          return_state=True,
                          return_sequences=True,
                          dropout=0.2)
      state = layer(input1)[1:]

      input2 = keras.Input(batch_shape=(num_samples, timesteps, embedding_dim))
      output = layer_class(units)(input2, initial_state=state)
      model = keras.Model([input1, input2], output)

      inputs = [np.random.random((num_samples, timesteps, embedding_dim)),
                np.random.random((num_samples, timesteps, embedding_dim))]
      model.predict(inputs)
Пример #19
0
  def test_stacked_rnn_dropout(self):
    cells = [keras.layers.LSTMCell(3, dropout=0.1, recurrent_dropout=0.1),
             keras.layers.LSTMCell(3, dropout=0.1, recurrent_dropout=0.1)]
    layer = keras.layers.RNN(cells)

    with self.test_session():
      x = keras.Input((None, 5))
      y = layer(x)
      model = keras.models.Model(x, y)
      model.compile('sgd', 'mse')
      x_np = np.random.random((6, 5, 5))
      y_np = np.random.random((6, 3))
      model.train_on_batch(x_np, y_np)
Пример #20
0
    def testTopologicalAttributesMultiOutputLayer(self):
        class PowersLayer(keras.layers.Layer):
            def call(self, inputs):
                return [inputs**2, inputs**3]

        x = keras.Input(shape=(32, ))
        test_layer = PowersLayer()
        p1, p2 = test_layer(x)  # pylint: disable=not-callable

        self.assertEqual(test_layer.input, x)
        self.assertEqual(test_layer.output, [p1, p2])
        self.assertEqual(test_layer.input_shape, (None, 32))
        self.assertEqual(test_layer.output_shape, [(None, 32), (None, 32)])
Пример #21
0
    def test_stacked_rnn_attributes(self):
        cells = [keras.layers.LSTMCell(1), keras.layers.LSTMCell(1)]
        layer = keras.layers.RNN(cells)
        layer.build((None, None, 1))

        # Test weights
        self.assertEqual(len(layer.trainable_weights), 6)
        cells[0].trainable = False
        self.assertEqual(len(layer.trainable_weights), 3)
        self.assertEqual(len(layer.non_trainable_weights), 3)

        # Test `get_losses_for` and `losses`
        x = keras.Input((None, 1))
        loss_1 = math_ops.reduce_sum(x)
        loss_2 = math_ops.reduce_sum(cells[0].kernel)
        cells[0].add_loss(loss_1, inputs=x)
        cells[0].add_loss(loss_2)
        self.assertEqual(len(layer.losses), 2)
        self.assertEqual(layer.get_losses_for(None), [loss_2])
        self.assertEqual(layer.get_losses_for(x), [loss_1])

        # Test `get_updates_for` and `updates`
        cells = [keras.layers.LSTMCell(1), keras.layers.LSTMCell(1)]
        layer = keras.layers.RNN(cells)
        layer.build((None, None, 1))

        x = keras.Input((None, 1))
        update_1 = state_ops.assign_add(cells[0].kernel,
                                        x[0, 0, 0] * cells[0].kernel)
        update_2 = state_ops.assign_add(cells[0].kernel,
                                        array_ops.ones_like(cells[0].kernel))
        cells[0].add_update(update_1, inputs=x)
        cells[0].add_update(update_2)
        self.assertEqual(len(layer.updates), 2)
        self.assertEqual(len(layer.get_updates_for(None)), 1)
        self.assertEqual(len(layer.get_updates_for(x)), 1)
  def test_multi_gpu_test_multi_io_model(self):
    gpus = 2
    num_samples = 1000
    input_dim_a = 10
    input_dim_b = 5
    output_dim_a = 1
    output_dim_b = 2
    hidden_dim = 10
    epochs = 2
    target_gpu_id = [0, 1]

    if not check_if_compatible_devices(gpus=gpus):
      return

    with self.test_session():
      input_a = keras.Input((input_dim_a,))
      input_b = keras.Input((input_dim_b,))
      a = keras.layers.Dense(hidden_dim)(input_a)
      b = keras.layers.Dense(hidden_dim)(input_b)
      c = keras.layers.concatenate([a, b])
      output_a = keras.layers.Dense(output_dim_a)(c)
      output_b = keras.layers.Dense(output_dim_b)(c)
      model = keras.models.Model([input_a, input_b], [output_a, output_b])

      a_x = np.random.random((num_samples, input_dim_a))
      b_x = np.random.random((num_samples, input_dim_b))
      a_y = np.random.random((num_samples, output_dim_a))
      b_y = np.random.random((num_samples, output_dim_b))

      parallel_model = keras.utils.multi_gpu_model(model, gpus=gpus)
      parallel_model.compile(loss='mse', optimizer='rmsprop')
      parallel_model.fit([a_x, b_x], [a_y, b_y], epochs=epochs)

      parallel_model = keras.utils.multi_gpu_model(model, gpus=target_gpu_id)
      parallel_model.compile(loss='mse', optimizer='rmsprop')
      parallel_model.fit([a_x, b_x], [a_y, b_y], epochs=epochs)
Пример #23
0
    def testTopologicalAttributes(self):
        # test layer attributes / methods related to cross-layer connectivity.
        a = keras.Input(shape=(32, ), name='input_a')
        b = keras.Input(shape=(32, ), name='input_b')

        # test input, output, input_shape, output_shape
        test_layer = keras.layers.Dense(16, name='test_layer')
        a_test = test_layer(a)
        self.assertEqual(test_layer.input, a)
        self.assertEqual(test_layer.output, a_test)
        self.assertEqual(test_layer.input_shape, (None, 32))
        self.assertEqual(test_layer.output_shape, (None, 16))

        # test `get_*_at` methods
        dense = keras.layers.Dense(16, name='dense_1')
        a_2 = dense(a)
        b_2 = dense(b)

        self.assertEqual(dense.get_input_at(0), a)
        self.assertEqual(dense.get_input_at(1), b)
        self.assertEqual(dense.get_output_at(0), a_2)
        self.assertEqual(dense.get_output_at(1), b_2)
        self.assertEqual(dense.get_input_shape_at(0), (None, 32))
        self.assertEqual(dense.get_input_shape_at(1), (None, 32))
        self.assertEqual(dense.get_output_shape_at(0), (None, 16))
        self.assertEqual(dense.get_output_shape_at(1), (None, 16))

        # Test invalid value for attribute retrieval.
        with self.assertRaises(ValueError):
            dense.get_input_at(2)
        with self.assertRaises(AttributeError):
            new_dense = keras.layers.Dense(16)
            _ = new_dense.input
        with self.assertRaises(AttributeError):
            new_dense = keras.layers.Dense(16)
            _ = new_dense.output
        with self.assertRaises(AttributeError):
            new_dense = keras.layers.Dense(16)
            _ = new_dense.output_shape
        with self.assertRaises(AttributeError):
            new_dense = keras.layers.Dense(16)
            _ = new_dense.input_shape
        with self.assertRaises(AttributeError):
            new_dense = keras.layers.Dense(16)
            a = keras.Input(shape=(3, 32))
            a = keras.Input(shape=(5, 32))
            a_2 = dense(a)
            b_2 = dense(b)
            _ = new_dense.input_shape
        with self.assertRaises(AttributeError):
            new_dense = keras.layers.Dense(16)
            a = keras.Input(shape=(3, 32))
            a = keras.Input(shape=(5, 32))
            a_2 = dense(a)
            b_2 = dense(b)
            _ = new_dense.output_shape
Пример #24
0
  def test_state_reuse(self):
    timesteps = 3
    embedding_dim = 4
    units = 3
    num_samples = 2

    with self.test_session():
      inputs = keras.Input(batch_shape=(num_samples, timesteps, embedding_dim))
      layer = keras.layers.LSTM(units, return_state=True, return_sequences=True)
      outputs = layer(inputs)
      output, state = outputs[0], outputs[1:]
      output = keras.layers.LSTM(units)(output, initial_state=state)
      model = keras.models.Model(inputs, output)

      inputs = np.random.random((num_samples, timesteps, embedding_dim))
      outputs = model.predict(inputs)
Пример #25
0
  def test_builtin_rnn_cell_serialization(self):
    for cell_class in [keras.layers.SimpleRNNCell,
                       keras.layers.GRUCell,
                       keras.layers.LSTMCell]:
      with self.test_session():
        # Test basic case.
        x = keras.Input((None, 5))
        cell = cell_class(32)
        layer = keras.layers.RNN(cell)
        y = layer(x)
        model = keras.models.Model(x, y)
        model.compile(optimizer='rmsprop', loss='mse')

        # Test basic case serialization.
        x_np = np.random.random((6, 5, 5))
        y_np = model.predict(x_np)
        weights = model.get_weights()
        config = layer.get_config()
        layer = keras.layers.RNN.from_config(config)
        y = layer(x)
        model = keras.models.Model(x, y)
        model.set_weights(weights)
        y_np_2 = model.predict(x_np)
        self.assertAllClose(y_np, y_np_2, atol=1e-4)

        # Test stacking.
        cells = [cell_class(8),
                 cell_class(12),
                 cell_class(32)]
        layer = keras.layers.RNN(cells)
        y = layer(x)
        model = keras.models.Model(x, y)
        model.compile(optimizer='rmsprop', loss='mse')

        # Test stacked RNN serialization.
        x_np = np.random.random((6, 5, 5))
        y_np = model.predict(x_np)
        weights = model.get_weights()
        config = layer.get_config()
        layer = keras.layers.RNN.from_config(config)
        y = layer(x)
        model = keras.models.Model(x, y)
        model.set_weights(weights)
        y_np_2 = model.predict(x_np)
        self.assertAllClose(y_np, y_np_2, atol=1e-4)
Пример #26
0
  def test_return_state(self):
    num_states = 2
    timesteps = 3
    embedding_dim = 4
    units = 3
    num_samples = 2

    with self.test_session():
      inputs = keras.Input(batch_shape=(num_samples, timesteps, embedding_dim))
      layer = keras.layers.LSTM(units, return_state=True, stateful=True)
      outputs = layer(inputs)
      state = outputs[1:]
      assert len(state) == num_states
      model = keras.models.Model(inputs, state[0])

      inputs = np.random.random((num_samples, timesteps, embedding_dim))
      state = model.predict(inputs)
      self.assertAllClose(keras.backend.eval(layer.states[0]), state, atol=1e-4)
Пример #27
0
  def test_model_cloning_invalid_use_cases(self):
    seq_model = keras.models.Sequential()
    seq_model.add(keras.layers.Dense(4, input_shape=(4,)))

    x = keras.Input((4,))
    y = keras.layers.Dense(4)(x)
    fn_model = keras.models.Model(x, y)

    with self.assertRaises(ValueError):
      keras.models._clone_functional_model(seq_model)
    with self.assertRaises(ValueError):
      keras.models._clone_functional_model(None)
    with self.assertRaises(ValueError):
      keras.models._clone_sequential_model(fn_model)

    with self.assertRaises(ValueError):
      keras.models._clone_sequential_model(seq_model, input_tensors=[x, x])
    with self.assertRaises(ValueError):
      keras.models._clone_sequential_model(seq_model, input_tensors=y)
Пример #28
0
    def test_saving_model_with_long_layer_names(self):
        if h5py is None:
            return  # Skip test if models cannot be saved.

        with self.test_session():
            # This layer name will make the `layers_name` HDF5 attribute blow
            # out of proportion. Note that it fits into the internal HDF5
            # attribute memory limit on its own but because h5py converts
            # the list of layer names into numpy array, which uses the same
            # amout of memory for every item, it increases the memory
            # requirements substantially.
            x = keras.Input(shape=(2, ), name='input_' + ('x' * (2**15)))
            f = x
            for i in range(4):
                f = keras.layers.Dense(2, name='dense_%d' % (i, ))(f)
            model = keras.Model(inputs=[x], outputs=[f])
            model.compile(loss='mse', optimizer='adam', metrics=['acc'])

            x = np.random.random((1, 2))
            y = np.random.random((1, 2))
            model.train_on_batch(x, y)
            out = model.predict(x)

            fd, fname = tempfile.mkstemp('.h5')
            keras.models.save_model(model, fname)
            model = keras.models.load_model(fname)

            # Check that the HDF5 files contains chunked array
            # of layer names.
            with h5py.File(fname, 'r') as h5file:
                num_names_arrays = len([
                    attr for attr in h5file['model_weights'].attrs
                    if attr.startswith('layer_names')
                ])
            # The chunking of layer names array should have happened.
            self.assertGreater(num_names_arrays, 0)
            out2 = model.predict(x)
            self.assertAllClose(out, out2, atol=1e-05)

            # Cleanup
            os.close(fd)
            os.remove(fname)
Пример #29
0
  def test_return_state(self, layer_class):
    if test.is_gpu_available(cuda_only=True):
      with self.test_session(use_gpu=True):
        input_size = 10
        timesteps = 6
        units = 2
        num_samples = 32
        num_states = 2 if layer_class is keras.layers.CuDNNLSTM else 1

        inputs = keras.Input(batch_shape=(num_samples, timesteps, input_size))
        layer = layer_class(units, return_state=True, stateful=True)
        outputs = layer(inputs)
        _, state = outputs[0], outputs[1:]
        self.assertEqual(len(state), num_states)
        model = keras.models.Model(inputs, state[0])

        inputs = np.random.random((num_samples, timesteps, input_size))
        state = model.predict(inputs)
        np.testing.assert_allclose(
            keras.backend.eval(layer.states[0]), state, atol=1e-4)
Пример #30
0
    def test_layer_sharing_at_heterogenous_depth(self):
        with self.test_session():
            x_val = np.random.random((10, 5))

            x = keras.Input(shape=(5, ))
            a = keras.layers.Dense(5, name='A')
            b = keras.layers.Dense(5, name='B')
            output = a(b(a(b(x))))
            m = keras.models.Model(x, output)

            output_val = m.predict(x_val)

            config = m.get_config()
            weights = m.get_weights()

            m2 = keras.models.Model.from_config(config)
            m2.set_weights(weights)

            output_val_2 = m2.predict(x_val)
            self.assertAllClose(output_val, output_val_2, atol=1e-6)