diff --git a/tensorflow/python/keras/engine/training_arrays.py b/tensorflow/python/keras/engine/training_arrays.py index bc8944a0a08a2d..cca8f1bd1571de 100644 --- a/tensorflow/python/keras/engine/training_arrays.py +++ b/tensorflow/python/keras/engine/training_arrays.py @@ -35,6 +35,7 @@ from tensorflow.python.keras.utils.generic_utils import slice_arrays from tensorflow.python.keras.utils.mode_keys import ModeKeys from tensorflow.python.platform import tf_logging as logging +from tensorflow.python.util import nest try: from scipy.sparse import issparse # pylint: disable=g-import-not-at-top @@ -207,7 +208,8 @@ def model_iteration(model, val_samples_or_steps = validation_steps else: # Get num samples for printing. - val_samples_or_steps = val_inputs and val_inputs[0].shape[0] or None + val_samples_or_steps = val_inputs and nest.flatten( + val_inputs)[0].shape[0] or None if mode == ModeKeys.TRAIN and verbose: _print_train_info(num_samples_or_steps, val_samples_or_steps, is_dataset) diff --git a/tensorflow/python/keras/engine/training_arrays_test.py b/tensorflow/python/keras/engine/training_arrays_test.py index 280c3699ee4157..0d145b9c9479bc 100644 --- a/tensorflow/python/keras/engine/training_arrays_test.py +++ b/tensorflow/python/keras/engine/training_arrays_test.py @@ -110,6 +110,41 @@ def test_print_info_with_numpy(self, do_validation): if do_validation: self.assertIn(", validate on 50 samples", mock_stdout.getvalue()) + def test_dict_validation_input(self): + """Test case for GitHub issue 30122.""" + train_input_0 = np.random.rand(1000, 1) + train_input_1 = np.random.rand(1000, 1) + train_labels = np.random.rand(1000, 1) + val_input_0 = np.random.rand(1000, 1) + val_input_1 = np.random.rand(1000, 1) + val_labels = np.random.rand(1000, 1) + + input_0 = keras.Input(shape=(None,), name='input_0') + input_1 = keras.Input(shape=(None,), name='input_1') + + class my_model(keras.Model): + def __init__(self): + super(my_model, self).__init__(self) + self.hidden_layer_0 = keras.layers.Dense(100, activation="relu") + self.hidden_layer_1 = keras.layers.Dense(100, activation="relu") + self.concat = keras.layers.Concatenate() + self.out_layer = keras.layers.Dense(1, activation="sigmoid") + + def call(self, inputs=[input_0, input_1]): + activation_0 = self.hidden_layer_0(inputs['input_0']) + activation_1 = self.hidden_layer_1(inputs['input_1']) + concat = self.concat([activation_0, activation_1]) + return self.out_layer(concat) + + model = my_model() + model.compile(loss="mae", optimizer="adam") + + model.fit( + x={'input_0': train_input_0, 'input_1': train_input_1}, + y=train_labels, + validation_data=( + {'input_0': val_input_0, 'input_1': val_input_1}, val_labels)) + if __name__ == "__main__": test.main()