In TensorFlow, I am loading data from the MNIST dataset in the following way:
# Load MNIST dataset (input_train, target_train), (input_test, target_test) = mnist.load_data() # Set input shape sample_shape = input_train[0].shape img_width, img_height = sample_shape[0], sample_shape[1] input_shape = (img_width, img_height, 1)
Then I correctly set the input shape in the first layer of my Keras model:
# Create the model model = Sequential() model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=input_shape))
Still, I am getting the following error. What is the problem here?
C:\Users\chris\AppData\Roaming\Python\Python37\site-packages\tensorflow\python\keras\engine\training.py:805 train_function * return step_function(self, iterator) C:\Users\chris\AppData\Roaming\Python\Python37\site-packages\tensorflow\python\keras\engine\training.py:795 step_function ** outputs = model.distribute_strategy.run(run_step, args=(data,)) C:\Users\chris\AppData\Roaming\Python\Python37\site-packages\tensorflow\python\distribute\distribute_lib.py:1259 run return self._extended.call_for_each_replica(fn, args=args, kwargs=kwargs) C:\Users\chris\AppData\Roaming\Python\Python37\site-packages\tensorflow\python\distribute\distribute_lib.py:2730 call_for_each_replica return self._call_for_each_replica(fn, args, kwargs) C:\Users\chris\AppData\Roaming\Python\Python37\site-packages\tensorflow\python\distribute\distribute_lib.py:3417 _call_for_each_replica return fn(*args, **kwargs) C:\Users\chris\AppData\Roaming\Python\Python37\site-packages\tensorflow\python\keras\engine\training.py:788 run_step ** outputs = model.train_step(data) C:\Users\chris\AppData\Roaming\Python\Python37\site-packages\tensorflow\python\keras\engine\training.py:754 train_step y_pred = self(x, training=True) C:\Users\chris\AppData\Roaming\Python\Python37\site-packages\tensorflow\python\keras\engine\base_layer.py:998 __call__ input_spec.assert_input_compatibility(self.input_spec, inputs, self.name) C:\Users\chris\AppData\Roaming\Python\Python37\site-packages\tensorflow\python\keras\engine\input_spec.py:239 assert_input_compatibility str(tuple(shape))) ValueError: Input 0 of layer sequential is incompatible with the layer: : expected min_ndim=4, found ndim=3. Full shape received: (250, 28, 28)
1 Answers
Best Answer
The problem here is that the MNIST dataset provides samples that have a shape of (28, 28). With, say, 60.000 samples, the training data Tensor would have a shape of (60000, 28, 28). Conv2D however expects four dimensions and this throws the error – simply because it also expects the channels dimension, which in MNIST is nonexistent because it’s grayscale data and hence is 1.
Reshaping the data, while explicitly adding the channels dimension, resolves the issue.
# Load MNIST dataset (input_train, target_train), (input_test, target_test) = mnist.load_data() # Set input shape sample_shape = input_train[0].shape img_width, img_height = sample_shape[0], sample_shape[1] input_shape = (img_width, img_height, 1) # Reshape data input_train = input_train.reshape(len(input_train), input_shape[0], input_shape[1], input_shape[2]) input_test = input_test.reshape(len(input_test), input_shape[0], input_shape[1], input_shape[2])
Your Answer