首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Keras与Convolution2D不兼容

Keras与Convolution2D不兼容
EN

Stack Overflow用户
提问于 2019-07-01 22:05:23
回答 2查看 332关注 0票数 0

我将进入卷积神经网络,并希望为MNIST数据创建一个。每当我在CNN中添加一个卷积层时,我就会得到一个错误:

输入0与层conv2d_4不兼容:预期的ndim=4,找到ndim=5

我试图重塑X_Train数据集,但没有成功,我试图首先添加一个扁平层,但这会返回以下错误:

输入0与层conv2d_5不兼容:预期的ndim=4,找到ndim=2

代码语言:javascript
复制
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)

如果我注释掉卷积层,它会很好地工作(accuracy>95%),但是我正在计划制造一个更复杂的神经网络,它将来需要卷积,这是我的出发点。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-01 22:14:32

代码中有两个问题。

  1. 您正在对标签进行两次编码,一次使用to_categorical,另一次使用LabelBinarizer。这里不需要后者,所以只需使用to_categorical将标签编码为分类。

2.-您的输入形状不正确,应该是(28, 28, 1)

此外,您应该在卷积层之后添加一个Flatten层,这样Dense层才能正常工作。

票数 0
EN

Stack Overflow用户

发布于 2019-07-01 22:47:37

Keras正在寻找维数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文档这里

希望这能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56843008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档