Я настраиваю свою первую нейронную сеть с помощью keras и tensorflow. Я получил свой ввод в массив формы (60000, 28, 28), но когда я пытаюсь передать его модели, я получаю сообщение об ошибке, что входная форма неверна.
Я пробовал несколько разных форм ввода, включая (60000, 28, 28) (1, 28, 28) (28, 28) (28, 28, 1), но ни одна из них не работает.
model = kr.Sequential()
model.add(InputLayer(input_shape=(60000, 28, 28)))
model.add(Dense(units=784, activation='relu'))
model.add(Dense(units=392, activation='relu'))
model.add(Dense(units=196, activation='relu'))
model.add(Dense(units=10, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='Adam', metrics=['accuracy'])
training = model.fit(x=images_array, y=labels_array, epochs=10, batch_size=256)
Я бы ожидал, что он будет работать с формой ввода (60000, 28, 28), но я всегда получаю эту ошибку:
ValueError: Error when checking input: expected input_1 to have 4 dimensions, but got array with shape (60000, 28, 28)
Редактировать:
Спасибо всем, кто ответил. Ответ cho_uc действительно сработал, поэтому я его принял. Что я должен был упомянуть в посте, так это то, что я пытался построить модель, состоящую только из плотных слоев, поэтому я могу использовать ее в качестве эталона для будущих моделей.
Я решил проблему входного слоя с помощью:
images_array = images_array.reshape(-1, 28 * 28)
model.add(InputLayer(input_shape=(784, )))
Слой Keras Conv2D
выполняет операцию свертки. Он требует, чтобы его вход был 4-мерным массивом.
Мы должны изменить форму ввода на ( , 1, 28, 28) или, возможно, на ( , 28, 28, 1), в зависимости от вашей настройки и бэкенда (соглашение о макете изображения theano или tensorlow).
from keras import backend as K
if K.image_data_format() == 'channels_first' :
input_shape = (1, 28, 28)
X_train = X_train.reshape(X_train.shape[0], 1, 28, 28)
X_test = X_test.reshape(X_test.shape[0], 1, 28, 28)
else:
input_shape = (28, 28, 1)
X_train = X_train.reshape(X_train.shape[0], 28, 28, 1)
X_test = X_test.reshape(X_test.shape[0], 28, 28, 1)
Итак, вы должны изменить свои данные на (60000, 28, 28, 1) или (60000, 1, 28, 28)
Требуются две поправки.
model.add(InputLayer(input_shape=(28, 28, 1)))
fit()
должны иметь размерность (количество образцов, ширина, высота, каналы).assert images_array.shape == (60000, 28, 28, 1)