Keras CNN несовместим с Convolution2D - PullRequest
0 голосов
/ 02 июля 2019

Я вхожу в сверточные нейронные сети и хочу создать их для данных MNIST.Всякий раз, когда я добавляю сверточный слой к своему CNN, я получаю сообщение об ошибке:

Вход 0 несовместим со слоем conv2d_4: ожидаемый ndim = 4, найденный ndim = 5

Я пытался изменить форму X_Trainнабор данных, но безуспешно Я попытался сначала добавить плоский слой, но он возвращает эту ошибку:

Ввод 0 несовместим со слоем conv2d_5: ожидаемый ndim = 4, найденный ndim = 2

import keras
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Convolution2D
from keras.layers import Flatten, Dense, Dropout
img_width, img_height = 28, 28
mnist = keras.datasets.mnist
(X_train, Y_train), (X_test, Y_test) = mnist.load_data()
(X_train, y_train), (X_test, y_test) = mnist.load_data()

X_train = keras.utils.normalize(X_train, axis=1) #Normalizes from 0-1 (originally each pixel is valued 0-255)
X_test = keras.utils.normalize(X_test, axis=1) #Normalizes from 0-1 (originally each pixel is valued 0-255)
Y_train = keras.utils.to_categorical(Y_train) #Reshapes to allow ytrain to work with x train
Y_test = keras.utils.to_categorical(Y_test)

from sklearn import preprocessing
lb = preprocessing.LabelBinarizer()
Y_train = lb.fit_transform(Y_train)
Y_test = lb.fit_transform(Y_test)

#Model
model = Sequential()
model.add(Flatten())
model.add(Convolution2D(16, 5, 5, activation='relu', input_shape=(1,img_width, img_height, 1)))
model.add(Dense(128, activation='relu'))
model.add(Dense(128, activation='relu'))
model.add(Dropout(.2))
model.add(Dense(64, activation='relu'))
model.add(Dense(10, activation='softmax'))

model.compile(optimizer = 'adam',
            loss='categorical_crossentropy',
            metrics=['accuracy'])
model.fit(X_train, Y_train, epochs=3, verbose=2)

val_loss, val_acc = model.evaluate(X_test, Y_test) #Check to see if model fits test
print(val_loss, val_acc)

Если я закомментирую сверточный слой, он будет работать очень хорошо (точность> 95%), но я планирую создать более сложную нейронную сеть, которая потребует в будущем сверточность, и это моя отправная точка

Ответы [ 2 ]

0 голосов
/ 02 июля 2019

Керас ищет тензор измерения 4, но получает число измерения как 2. сначала убедитесь, что размер ядра в слое Conv2D указан в скобках model.add(Convolution2D(32, (3, 3), activation='relu', input_shape=(img_height, img_height, 1)))

Во-вторых, вам нужно изменить форму переменной X_train, X_test, так как слой Conv2D ожидает ввода тензора.

X_train = X_train.reshape(-1,28, 28, 1) #Reshape for CNN - should work!! X_test = X_test.reshape(-1,28, 28, 1) model.fit(X_train, Y_train, epochs=3, verbose=2)

Дополнительную информацию о Conv2D вы можете найти в документации Keras здесь

Надеюсь, это поможет.

0 голосов
/ 02 июля 2019

В вашем коде есть две проблемы.

  1. Вы кодируете свои метки два раза, один раз используя to_categorical, а другой раз LabelBinarizer.Последнее здесь не нужно, поэтому просто один раз закодируйте ваши ярлыки в категориальные, используя to_categorical.

2.- Ваша форма ввода неверна, она должна быть (28, 28, 1).

Также вы должны добавить слой Flatten после сверточных слоев, чтобы слой Dense работал правильно.

...