网络的结构是这样的:
#1st layer
model.add(Conv2D(20, 5, 5, activation='sigmoid', input_shape=(32, 32, 1)))
model.add(MaxPool2D(pool_size=(2, 2)))
#2nd layer
model.add(Conv2D(30, 5, 5, activation='sigmoid'))
model.add(MaxPool2D(pool_size=(2, 2)))
#fully connected layer
model.add(Flatten())
model.add(Dense(500, init='normal', activation='sigmoid'))
# model.add(Dropout(0.5))
# model.add(Dense(10, activation='sigmoid'))
#model.add(Reshape((-1, 5)))
model.add(Dense(5, init='normal', activation='softmax'))
调用网络时:
model.fit(x=traindata, y=trainlabel, batch_size=16, nb_epoch=15, shuffle=True, verbose=1, validation_data=(testdata, testlabel))
报错是这个:
ValueError: Error when checking input: expected conv2d_1_input to have 4 dimensions, but got array with shape (500, 5)
然后x向量为4维的图片信息,y向量为图片的标签,他们的shape分别是(500, 32, 32, 1),(500, 5),就是不懂为什么y向也需要是4维的呢
题主其实想问的是"为什么x向量也是4维"而不是y吧。假如我没有理解错的话,那么:
问题在于你的
traindata
的shape
那里。你可以检查一下你的traindata.shape()
。正确的维度应该是(500,32,32,1)
,如果传进去的是(500,32,32)
就会报题主描述的错误,输入维度和层数定义维度不符合。你可以尝试复现一下错误,随机生成不同
shape
的矩阵传进去试一下。traindata = numpy.random.rand(500, 32, 32)
和traindata = numpy.random.rand(500, 32, 32, 1)
。你会发现前者会报错。其实每一张二维图片并不是只有两个维度,还有一个颜色通道。彩色图片又rgb三个通道,所以是3,黑白图片则是1。你的
traindata
应该是(数据集个数,图片长度像素,图片宽度像素,图片颜色通道数)
。解决方式可以对
traindata
全部添加一个值为1(如果是彩色图片则添加3)的第四个维度即可。