用keras构建CNN做图片多分类问题,关于label向量的维度问题

网络的结构是这样的:

#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维的呢

阅读 6.5k
1 个回答

题主其实想问的是"为什么x向量也是4维"而不是y吧。假如我没有理解错的话,那么:

问题在于你的traindatashape那里。你可以检查一下你的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)的第四个维度即可。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题