I am currently studying from *Hands-On Machine Learning with Scikit-Learn and TensorFlow*. At some point in Chapter 10, the author demonstrates an MLP architecture to tackle the FashionMNIST problem: model = keras.models.Sequential() model.add(keras.layers.Flatten(input_shape=[28, 28])) model.add(keras.layers.Dense(300, activation="relu")) model.add(keras.layers.Dense(100, activation="relu")) model.add(keras.layers.Dense(10, activation="softmax")) He then gives the following descripition for the flatten layer: > Next, we build the first layer and add it to the model. It is a > Flatten layer whose role is simply to convert each input image into a > **1D array**: if it receives input data X, it computes **X.reshape(-1, 1)**. > This layer does not have any parameters, it is just there to do some > simple preprocessing. Since it is the first layer in the model, you > should specify the input_shape: this does not include the batch size, > only the shape of the instances. Alternatively, you could add a > keras.layers.InputLayer as the first layer, setting shape=[28,28]. At this point, I can't understand why X.reshape(-1,1) is the chosen reshape action. Assuming that Flatten is performed separately for each batch (is that true?), it should transform (28,28) to (784,), yet the above reshape yields (784,**1**), which is not even a 1-D array. If that is correct, what is the purpose of this extra dimension with length 1?