diff options
author | Zhenyu Tan <tanzheny@google.com> | 2018-09-12 12:33:24 -0700 |
---|---|---|
committer | TensorFlower Gardener <gardener@tensorflow.org> | 2018-09-12 12:42:47 -0700 |
commit | 3fb474713b27552eba1943bb4172e54ad2dd13bc (patch) | |
tree | affa9a8d670fe77de364dffda74584a194855ab7 /tensorflow/python/estimator | |
parent | 28e945e590b07de137f318a70896bc4fc31f7053 (diff) |
Add unit test for model_to_estimator where inpu_fn
returns features and labels as a list instead of dict.
PiperOrigin-RevId: 212685344
Diffstat (limited to 'tensorflow/python/estimator')
-rw-r--r-- | tensorflow/python/estimator/keras_test.py | 166 |
1 files changed, 122 insertions, 44 deletions
diff --git a/tensorflow/python/estimator/keras_test.py b/tensorflow/python/estimator/keras_test.py index 7e5a0c80a7..3758243d7b 100644 --- a/tensorflow/python/estimator/keras_test.py +++ b/tensorflow/python/estimator/keras_test.py @@ -102,6 +102,49 @@ def gen_input_fn(x, y=None, batch_size=128, num_epochs=1, shuffle=False): return input_fn +def get_multi_inputs_multi_outputs_data(): + (a_train, c_train), (a_test, c_test) = testing_utils.get_test_data( + train_samples=_TRAIN_SIZE, + test_samples=50, + input_shape=(16,), + num_classes=3, + random_seed=_RANDOM_SEED) + (b_train, d_train), (b_test, d_test) = testing_utils.get_test_data( + train_samples=_TRAIN_SIZE, + test_samples=50, + input_shape=(16,), + num_classes=2, + random_seed=_RANDOM_SEED) + (m_train, _), (m_test, _) = testing_utils.get_test_data( + train_samples=_TRAIN_SIZE, + test_samples=50, + input_shape=(8,), + num_classes=2, + random_seed=_RANDOM_SEED) + + c_train = keras.utils.to_categorical(c_train) + c_test = keras.utils.to_categorical(c_test) + d_train = keras.utils.to_categorical(d_train) + d_test = keras.utils.to_categorical(d_test) + + train_data = { + 'input_a': a_train, + 'input_b': b_train, + 'input_m': m_train, + 'output_c': c_train, + 'output_d': d_train + } + test_data = { + 'input_a': a_test, + 'input_b': b_test, + 'input_m': m_test, + 'output_c': c_test, + 'output_d': d_test + } + + return (train_data, test_data) + + def get_resource_for_simple_model(model_type='sequential', is_evaluate=False,): if model_type == 'sequential': @@ -159,20 +202,21 @@ def randomize_io_type(array, name): def multi_inputs_multi_outputs_model(): - a = keras.layers.Input(shape=(16,), name='input_a') - b = keras.layers.Input(shape=(16,), name='input_b') - m = keras.layers.Input(shape=(8,), dtype='string', name='input_m') + input_a = keras.layers.Input(shape=(16,), name='input_a') + input_b = keras.layers.Input(shape=(16,), name='input_b') + input_m = keras.layers.Input(shape=(8,), dtype='string', name='input_m') dense = keras.layers.Dense(8, name='dense_1') - a_2 = dense(a) + interm_a = dense(input_a) # Read m - m_2 = keras.layers.Lambda(gen_parsing_ops.string_to_number)(m) - s_2 = keras.layers.Lambda(lambda k: k[0] * k[1])([m_2, a_2]) - b_2 = dense(b) - merged = keras.layers.concatenate([s_2, b_2], name='merge') - c = keras.layers.Dense(3, activation='softmax', name='dense_2')(merged) - d = keras.layers.Dense(2, activation='softmax', name='dense_3')(merged) - model = keras.models.Model(inputs=[a, b, m], outputs=[c, d]) + interm_m = keras.layers.Lambda(gen_parsing_ops.string_to_number)(input_m) + interm_s = keras.layers.Lambda(lambda k: k[0] * k[1])([interm_m, interm_a]) + interm_b = dense(input_b) + merged = keras.layers.concatenate([interm_s, interm_b], name='merge') + output_c = keras.layers.Dense(3, activation='softmax', name='dense_2')(merged) + output_d = keras.layers.Dense(2, activation='softmax', name='dense_3')(merged) + model = keras.models.Model( + inputs=[input_a, input_b, input_m], outputs=[output_c, output_d]) model.compile( loss='categorical_crossentropy', optimizer='rmsprop', @@ -414,51 +458,85 @@ class TestKerasEstimator(test_util.TensorFlowTestCase): ] self.assertAllEqual(est_pred, keras_pred) - def test_multi_inputs_multi_outputs(self): - np.random.seed(_RANDOM_SEED) - (a_train, c_train), (a_test, c_test) = testing_utils.get_test_data( - train_samples=_TRAIN_SIZE, - test_samples=50, - input_shape=(16,), - num_classes=3) - np.random.seed(_RANDOM_SEED) - (b_train, d_train), (b_test, d_test) = testing_utils.get_test_data( - train_samples=_TRAIN_SIZE, - test_samples=50, - input_shape=(16,), - num_classes=2) - np.random.seed(_RANDOM_SEED) - (input_m_train, _), (input_m_test, _) = testing_utils.get_test_data( - train_samples=_TRAIN_SIZE, - test_samples=50, - input_shape=(8,), - num_classes=2) - - c_train = keras.utils.to_categorical(c_train) - c_test = keras.utils.to_categorical(c_test) - d_train = keras.utils.to_categorical(d_train) - d_test = keras.utils.to_categorical(d_test) + def test_multi_inputs_multi_outputs_with_input_fn_as_dict(self): + train_data, test_data = get_multi_inputs_multi_outputs_data() def train_input_fn(): - input_dict = {'input_a': a_train, 'input_b': b_train, - 'input_m': input_m_train.astype(np.str)} - output_dict = {'dense_2': c_train, 'dense_3': d_train} + input_dict = { + 'input_a': train_data['input_a'], + 'input_b': train_data['input_b'], + 'input_m': train_data['input_m'].astype(np.str) + } + output_dict = { + 'dense_2': train_data['output_c'], + 'dense_3': train_data['output_d'] + } return input_dict, output_dict def eval_input_fn(): - input_dict = {'input_a': a_test, 'input_b': b_test, - 'input_m': input_m_test.astype(np.str)} - output_dict = {'dense_2': c_test, 'dense_3': d_test} + input_dict = { + 'input_a': test_data['input_a'], + 'input_b': test_data['input_b'], + 'input_m': test_data['input_m'].astype(np.str) + } + output_dict = { + 'dense_2': test_data['output_c'], + 'dense_3': test_data['output_d'] + } return input_dict, output_dict + def pred_input_fn(): + input_dict = { + 'input_a': test_data['input_a'], + 'input_b': test_data['input_b'], + 'input_m': test_data['input_m'].astype(np.str) + } + return input_dict + + self.do_test_multi_inputs_multi_outputs_with_input_fn( + train_input_fn, eval_input_fn, pred_input_fn) + + def test_multi_inputs_multi_outputs_with_input_fn_as_list(self): + train_data, test_data = get_multi_inputs_multi_outputs_data() + + def train_input_fn(): + input_list = [ + train_data['input_a'], train_data['input_b'], + train_data['input_m'].astype(np.str) + ] + output_list = [train_data['output_c'], train_data['output_d']] + return input_list, output_list + + def eval_input_fn(): + input_list = [ + test_data['input_a'], test_data['input_b'], + test_data['input_m'].astype(np.str) + ] + output_list = [test_data['output_c'], test_data['output_d']] + return input_list, output_list + + def pred_input_fn(): + input_list = [ + test_data['input_a'], test_data['input_b'], + test_data['input_m'].astype(np.str) + ] + return input_list + + self.do_test_multi_inputs_multi_outputs_with_input_fn( + train_input_fn, eval_input_fn, pred_input_fn) + + def do_test_multi_inputs_multi_outputs_with_input_fn( + self, train_input_fn, eval_input_fn, pred_input_fn): with self.cached_session(): model = multi_inputs_multi_outputs_model() est_keras = keras_lib.model_to_estimator( keras_model=model, config=self._config) - before_eval_results = est_keras.evaluate(input_fn=eval_input_fn, steps=1) + baseline_eval_results = est_keras.evaluate( + input_fn=eval_input_fn, steps=1) est_keras.train(input_fn=train_input_fn, steps=_TRAIN_SIZE / 16) - after_eval_results = est_keras.evaluate(input_fn=eval_input_fn, steps=1) - self.assertLess(after_eval_results['loss'], before_eval_results['loss']) + eval_results = est_keras.evaluate(input_fn=eval_input_fn, steps=1) + self.assertLess(eval_results['loss'], baseline_eval_results['loss']) + est_keras.predict(input_fn=pred_input_fn) def test_init_from_file(self): if h5py is None: |