Ошибка в сверточной нейронной сети для формы ввода - PullRequest
0 голосов
/ 31 мая 2018

У меня есть изображения с разрешением 1000, 28 * 28.Я преобразовал эти 1000 изображений в массив numpy и сформировал новый массив размером (1000, 28, 28).Таким образом, при создании сверточного слоя с использованием керас, входная форма (значение X) указывается как (1000, 28, 28), а выходная форма (значение Y) - (1000, 10).Поскольку у меня есть 1000 примеров ввода и 10 категорий вывода.

model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),activation='relu',kernel_initializer='he_normal',input_shape=(1000,28,28)))
.
.
.
model.fit(train_x,train_y,batch_size=32,epochs=10,verbose=1)

Таким образом, при использовании функции fit она показывает ValueError: Error when checking input: expected conv2d_1_input to have 4 dimensions, but got array with shape (1000, 28, 28) как ошибку.Пожалуйста, помогите мне, ребята, предоставить надлежащие входные и выходные размеры для CNN.

Код:

 model = Sequential()
 model.add(Conv2D(32, kernel_size=(3, 3),activation='relu',kernel_initializer='he_normal',input_shape=(4132,28,28)))
 model.add(MaxPooling2D((2, 2)))
 model.add(Dropout(0.25))

 model.add(Conv2D(64, (3, 3), activation='relu'))
 model.add(MaxPooling2D(pool_size=(2, 2)))
 model.add(Dropout(0.25))

 model.add(Conv2D(128, (3, 3), activation='relu'))
 model.add(Dropout(0.4))

 model.add(Flatten())
 model.add(Dense(128, activation='relu'))
 model.add(Dropout(0.3))
 model.add(Dense(10, activation='softmax'))

 model.compile(loss=keras.losses.categorical_crossentropy,optimizer=keras.optimizers.Adam(),metrics=['accuracy'])
 model.summary()

 train_x  = numpy.array([train_x])

 model.fit(train_x,train_y,batch_size=32,epochs=10,verbose=1)

Ответы [ 3 ]

0 голосов
/ 31 мая 2018

Вам нужно изменить входы на 4 измерения с channel, установленным на 1: (1000, 28, 28, 1), и вам нужно изменить input_shape сверточного слоя на (28, 28, 1):

model.add(Conv2D(32, kernel_size=(3, 3),...,input_shape=(28,28,1)))
0 голосов
/ 11 июня 2018

из вашего ввода похоже, что вы используете тензор потока в качестве внутреннего конца.

В кератах input_shape всегда должно быть 3-мерным.Для тензорного потока в качестве бэкэнда input_shape для вашей модели будет

input_shape = [img_height,img_width,channels(depth)]

в вашем случае для тензорного потока, который должен быть

input_shape = [28,28,1]

, а форма train_x должнабыть

train_x = [batch_size,img_height,img_width,channels(depth)]

в вашем случае

train_x = [1000,28,28,1]

Поскольку вы используете изображение в оттенках серого, размер изображения будет (image_height, image_width), и, следовательно, вы должны добавитьдополнительное измерение к изображению, которое приведет к (image_height, image_width, 1) «1» означает глубину изображения, для серой шкалы «1» и для rgb «3».

0 голосов
/ 31 мая 2018

Вашим массивам необходимо четвертое измерение, общий стандарт - нумерация образцов с первым измерением, поэтому изменяется (1000, 28, 28) на (1, 1000, 28, 28).

Подробнее об этом можно прочитать здесь .

...