Keras CNN 与 Convolution2D 不兼容

Keras CNN Incompatible with Convolution2D

我正在学习卷积神经网络,想为 MNIST 数据创建一个。每当我向我的 CNN 添加卷积层时,我都会收到错误消息:

输入 0 与层 conv2d_4 不兼容:预期 ndim=4,发现 ndim=5

我尝试重塑 X_Train 数据集但没有成功 我尝试先添加一个展平层,但是 returns 这个错误:

输入 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%),但我计划在未来制作一个需要卷积的更复杂的神经网络,这是我的起点

您的代码中有两个问题。

  1. 您对标签进行了两次编码,一次使用 to_categorical,另一次使用 LabelBinarizer。此处不需要后者,因此只需使用 to_categorical.
  2. 将标签编码为分类一次

2.- 你输入的形状不对,应该是(28, 28, 1).

您还应该在卷积层之后添加一个 Flatten 层,以便 Dense 层正常工作。

Keras 正在寻找 4 维张量,但它的 ndim 维数为 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 文档 here

希望对您有所帮助。