Я спрашиваю об этом, потому что чувствую, что упускаю что-то фундаментальное.
В настоящее время большинство знает, что изображения MNIST имеют размер 28X28 пикселей. Документация keras говорит мне о Dense:
Входной тензор nD формы с формой: (batch_size, ..., input_dim). Наиболее распространенная ситуация - это двумерный ввод с формой (batch_size, input_dim).
Таким образом, такой новичок, как я, предположил бы, что изображения можно подавать на модель в виде матрицы 28 * 28. Тем не менее, каждый учебник, который я нашел, проходит через различные гимнастики, чтобы преобразовать изображения в одну функцию длиной 784 *.
Иногда
num_pixels = X_train.shape[1] * X_train.shape[2]
model.add(Dense(num_pixels, input_dim=num_pixels, activation='...'))
или
num_pixels = np.prod(X_train.shape[1:])
model.add(Dense(512, activation='...', input_shape=(num_pixels,)))
или
model.add(Dense(units=10, input_dim=28*28, activation='...'))
history = model.fit(X_train.reshape((-1,28*28)), ...)
или даже:
model = Sequential([Dense(32, input_shape=(784,)), ...),])
Так что мой вопрос просто - почему? Разве Dense не может просто принять изображение как есть или, если необходимо, просто обработать его «за кадром», как это было? И если, как я подозреваю, эта обработка должна быть выполнена, является ли какой-либо из этих (или других) по своей природе предпочтительным?