def test_bucketize_with_explicit_buckets_ragged_int_input(self): input_array = ragged_factory_ops.constant([[-1, 1, 3, 0], [0, 3, 1]], dtype=dtypes.int64) expected_output = [[0, 2, 3, 1], [1, 3, 2]] expected_output_shape = [None, None] input_data = keras.Input(shape=(None,), ragged=True, dtype=dtypes.int64) layer = discretization.Discretization(bin_boundaries=[-.5, 0.5, 1.5]) bucket_data = layer(input_data) self.assertAllEqual(expected_output_shape, bucket_data.shape.as_list()) model = keras.Model(inputs=input_data, outputs=bucket_data) output_dataset = model.predict(input_array) self.assertAllEqual(expected_output, output_dataset)
def test_bucketize_with_explicit_buckets_integer(self): input_array = np.array([[-1.5, 1.0, 3.4, .5], [0.0, 3.0, 1.3, 0.0]]) expected_output = [[0, 2, 3, 1], [1, 3, 2, 1]] expected_output_shape = [None, 4] input_data = keras.Input(shape=(4, )) layer = discretization.Discretization(bin_boundaries=[0., 1., 2.]) bucket_data = layer(input_data) self.assertAllEqual(expected_output_shape, bucket_data.shape.as_list()) model = keras.Model(inputs=input_data, outputs=bucket_data) output_dataset = model.predict(input_array) self.assertAllEqual(expected_output, output_dataset)
def test_bucketize_with_explicit_buckets_sparse_int_input(self): indices = [[0, 1], [0, 2], [1, 1]] input_array = sparse_tensor.SparseTensor(indices=indices, values=[-1, 1, 3], dense_shape=[2, 3]) expected_output = [0, 2, 3] input_data = keras.Input(shape=(3, ), dtype=dtypes.int32, sparse=True) layer = discretization.Discretization(bin_boundaries=[-.5, 0.5, 1.5]) bucket_data = layer(input_data) model = keras.Model(inputs=input_data, outputs=bucket_data) output_dataset = model.predict(input_array, steps=1) self.assertAllEqual(indices, output_dataset.indices) self.assertAllEqual(expected_output, output_dataset.values)
def test_bucketize_with_explicit_buckets_ragged_float_input(self): input_array = ragged_factory_ops.constant([[-1.5, 1.0, 3.4, .5], [0.0, 3.0, 1.3]]) expected_output = [[0, 1, 3, 1], [0, 3, 2]] expected_output_shape = [None, None] input_data = keras.Input(shape=(None, ), ragged=True) layer = discretization.Discretization(bins=[0., 1., 2.]) bucket_data = layer(input_data) self.assertAllEqual(expected_output_shape, bucket_data.shape.as_list()) model = keras.Model(inputs=input_data, outputs=bucket_data) output_dataset = model.predict(input_array) self.assertAllEqual(expected_output, output_dataset)
def test_bucketize_with_explicit_buckets_int_input(self): input_array = np.array([[-1, 1, 3, 0], [0, 3, 1, 0]], dtype=np.int64) expected_output = [[0, 2, 3, 1], [1, 3, 2, 1]] expected_output_shape = [None, None] input_data = keras.Input(shape=(None, ), dtype=dtypes.int64) layer = discretization.Discretization( bins=[-.5, 0.5, 1.5], output_mode=discretization.INTEGER) bucket_data = layer(input_data) self.assertAllEqual(expected_output_shape, bucket_data.shape.as_list()) model = keras.Model(inputs=input_data, outputs=bucket_data) output_dataset = model.predict(input_array) self.assertAllEqual(expected_output, output_dataset)
def test_distribution(self, distribution): input_array = np.array([[-1.5, 1.0, 3.4, .5], [0.0, 3.0, 1.3, 0.0]]) expected_output = [[0, 2, 3, 1], [1, 3, 2, 1]] expected_output_shape = [None, None] with distribution.scope(): input_data = keras.Input(shape=(None,)) layer = discretization.Discretization( bins=[0., 1., 2.], output_mode=discretization.INTEGER) bucket_data = layer(input_data) self.assertAllEqual(expected_output_shape, bucket_data.shape.as_list()) model = keras.Model(inputs=input_data, outputs=bucket_data) output_dataset = model.predict(input_array) self.assertAllEqual(expected_output, output_dataset)
def test_distribution(self, distribution): input_array = np.array([[-1.5, 1.0, 3.4, .5], [0.0, 3.0, 1.3, 0.0]]) expected_output = [[0, 1, 3, 1], [0, 3, 2, 0]] expected_output_shape = [None, 4] config.set_soft_device_placement(True) with distribution.scope(): input_data = keras.Input(shape=(4,)) layer = discretization.Discretization(bins=[0., 1., 2.]) bucket_data = layer(input_data) self.assertAllEqual(expected_output_shape, bucket_data.shape.as_list()) model = keras.Model(inputs=input_data, outputs=bucket_data) output_dataset = model.predict(input_array) self.assertAllEqual(expected_output, output_dataset)
def test_bucketize_with_explicit_buckets_one_hot(self): input_array = np.array([[-1.5, 1.0, 3.4, .5], [0.0, 3.0, 1.3, 0.0]]) # pyformat: disable expected_output = [[[1, 0, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1], [0, 1, 0, 0]], [[0, 1, 0, 0], [0, 0, 0, 1], [0, 0, 1, 0], [0, 1, 0, 0]]] # pyformat: enable num_buckets = 4 expected_output_shape = [None, None, num_buckets] input_data = keras.Input(shape=(None, )) layer = discretization.Discretization( bins=[0., 1., 2.], output_mode=discretization.BINARY) bucket_data = layer(input_data) self.assertAllEqual(expected_output_shape, bucket_data.shape.as_list()) model = keras.Model(inputs=input_data, outputs=bucket_data) output_dataset = model.predict(input_array) self.assertAllEqual(expected_output, output_dataset)
def test_layer_computation(self, adapt_data, test_data, use_dataset, expected, num_bins=5, epsilon=0.01): input_shape = tuple(list(test_data.shape)[1:]) np.random.shuffle(adapt_data) if use_dataset: # Keras APIs expect batched datasets adapt_data = dataset_ops.Dataset.from_tensor_slices(adapt_data).batch( test_data.shape[0] // 2) test_data = dataset_ops.Dataset.from_tensor_slices(test_data).batch( test_data.shape[0] // 2) layer = discretization.Discretization(epsilon=epsilon, num_bins=num_bins) layer.adapt(adapt_data) input_data = keras.Input(shape=input_shape) output = layer(input_data) model = keras.Model(input_data, output) model._run_eagerly = testing_utils.should_run_eagerly() output_data = model.predict(test_data) self.assertAllClose(expected, output_data)
def test_multiple_adapts(self): first_adapt = [[1], [2], [3]] second_adapt = [[4], [5], [6]] predict_input = [[2], [2]] expected_first_output = [[1], [1]] expected_second_output = [[0], [0]] inputs = keras.Input(shape=(1,), dtype=dtypes.int32) layer = discretization.Discretization(num_bins=3) layer.adapt(first_adapt) outputs = layer(inputs) model = keras.Model(inputs=inputs, outputs=outputs) actual_output = model.predict(predict_input) self.assertAllClose(actual_output, expected_first_output) # Re-adapt the layer on new inputs. layer.adapt(second_adapt) # Re-compile the model. model.compile() # `predict` should now use the new model state. actual_output = model.predict(predict_input) self.assertAllClose(actual_output, expected_second_output)
def test_num_bins_and_bins_set_fails(self): with self.assertRaisesRegex( ValueError, r"`num_bins` and `bin_boundaries` should not be set.*5.*\[1, 2\]" ): _ = discretization.Discretization(num_bins=5, bins=[1, 2])
def test_num_bins_negative_fails(self): with self.assertRaisesRegex(ValueError, "`num_bins` must be.*num_bins=-7"): _ = discretization.Discretization(num_bins=-7)
def test_merge_with_unadapted_layers_fails(self): layer1 = discretization.Discretization(num_bins=2, name="layer1") layer1.adapt([1, 2, 3]) layer2 = discretization.Discretization(num_bins=2, name="layer2") with self.assertRaisesRegex(ValueError, "Cannot merge.*layer2"): layer1.merge_state([layer2])
def test_output_shape(self): input_data = keras.Input(batch_size=16, shape=(4,), dtype=dtypes.string) layer = discretization.Discretization(bin_boundaries=[-.5, 0.5, 1.5]) output = layer(input_data) self.assertAllEqual(output.shape.as_list(), [16, 4])