检查模型输入时发生错误:预期convolution2d_input_1具有4个维度,但数组的形状为(32,32,3)
deep-learning
keras
keras-layer
10
0

我想训练一个从以下层开始的深度网络:

model = Sequential()
model.add(Conv2D(32, 3, 3, input_shape=(32, 32, 3)))

使用

history = model.fit_generator(get_training_data(),
                samples_per_epoch=1, nb_epoch=1,nb_val_samples=5,
                verbose=1,validation_data=get_validation_data()

使用以下生成器:

def get_training_data(self):
     while 1:
        for i in range(1,5):
            image = self.X_train[i]
            label = self.Y_train[i]
            yield (image,label)

(验证生成器看起来类似)。

在训练过程中,我得到了错误:

Error when checking model input: expected convolution2d_input_1 to have 4 
dimensions, but got array with shape (32, 32, 3)

怎么会有第一层

 model.add(Conv2D(32, 3, 3, input_shape=(32, 32, 3)))

参考资料:
Stack Overflow
收藏
评论
共 3 个回答
高赞 时间 活跃

您定义的输入形状是单个样本的形状。该模型本身希望将一些样本数组作为输入(即使其长度为1的数组)。

您的输出实际上应该是4-d,其中第一个维度用于枚举样本。也就是说,对于单个图像,您应该返回形状(1、32、32、3)。

你可以找到更多的信息在这里下的“Convolution2D” /“输入型”

收藏
评论

可能非常琐碎 ,但我通过将输入转换为numpy数组来解决

对于神经网络架构,

    model = Sequential()
    model.add(Conv2D(32, (5, 5), activation="relu", input_shape=(32, 32, 3)))

输入的时候

    n_train = len(train_y_raw)
    train_X = [train_X_raw[:,:,:,i] for i in range(n_train)]
    train_y = [train_y_raw[i][0] for i in range(n_train)]

我弄错了在此处输入图片说明

但是当我更改为

   n_train = len(train_y_raw)
   train_X = np.asarray([train_X_raw[:,:,:,i] for i in range(n_train)])
   train_y = np.asarray([train_y_raw[i][0] for i in range(n_train)])

它解决了这个问题。

收藏
评论

添加一个维度非常简单,所以我正在研究Siraj Rawal在CNN代码部署教程上讲授的教程,它在他的终端上运行,但是同一代码在我的终端上不起作用,所以我做了一些研究关于它并解决了,我不知道这是否对你们所有人都有效。在这里,我想出了解决方案。

未解决的代码行给您带来了问题:

if K.image_data_format() == 'channels_first':
    x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols)
    x_test = x_test.reshape(x_test.shape[0], 1, img_rows, img_cols)
    print(x_train.shape)
    input_shape = (1, img_rows, img_cols)
else:
    x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols)
    x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols)
    input_shape = (img_rows, img_cols, 1)

解决的代码:

if K.image_data_format() == 'channels_first':
    x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols)
    x_test = x_test.reshape(x_test.shape[0], 1, img_rows, img_cols)
    print(x_train.shape)
    input_shape = (1, img_rows, img_cols)
else:
    x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)
    x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)
    input_shape = (img_rows, img_cols, 1)

如果适合您,请在此处分享反馈。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号