Deep learning 检查模型输入时出错:预期卷积2D_输入_1有4个维度,但得到了形状为(32,32,3)的数组

Deep learning 检查模型输入时出错:预期卷积2D_输入_1有4个维度,但得到了形状为(32,32,3)的数组,deep-learning,keras,keras-layer,Deep Learning,Keras,Keras Layer,我想从以下层开始训练深层网络: 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_da

我想从以下层开始训练深层网络:

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)))

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

您的输出应该是4-d,第1维用于枚举样本。i、 对于单个图像,您应该返回(1,32,32,3)的形状

您可以在“卷积2D”/“输入形状”下找到更多信息

编辑:根据Danny下面的评论,如果您希望批量大小为1,可以使用以下方法添加缺少的维度:

image = np.expand_dims(image, axis=0)
输出:

培训60000个样本,验证10000个样本 纪元1/5 60000/60000[============================================================157s 3ms/阶跃-损耗:0.0981-附件:0.9692-val_损耗:0.0468-val_附件:0.9861 纪元2/5 60000/60000[============================================================157s 3ms/阶跃-损耗:0.0352-附件:0.9892-val_损耗:0.0408-val_附件:0.9879 纪元3/5 60000/60000[==================================================================-159s 3ms/步长-损耗:0.0242-acc:0.9924-val_损耗:0.0291-val_acc:0.9913 纪元4/5 60000/60000[==================================================================-165s 3ms/步-损耗:0.0181-附件:0.9945-val\u损耗:0.0361-val\u附件:0.9888 纪元5/5 60000/60000[=====================================================================-168s 3ms/步长-损耗:0.0142-acc:0.9958-val_损耗:0.0354-val_acc:0.9906


这就像添加一个维度一样简单,所以我在看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)

如果这对您有效,请在此处分享反馈。

这取决于您实际如何订购数据,如果是以渠道为基础,则您应该重新调整数据: x_-train=x_-train.整形(x_-train.形状[0],通道,宽度,高度)

如果其频道持续:
x_train=s_train.reformate(x_train.shape[0],宽度,高度,通道)

可能非常小,但我通过将输入转换为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)])

它解决了这个问题。

您只需对输入数据数组应用以下转换即可

input_data = input_data.reshape((-1, image_side1, image_side2, channels))

我在使用mnist数据集时遇到了相同的错误,看起来X_列的尺寸有问题。我添加了另一个维度,它解决了这个问题

X_列车,X_测试\ y_系列,y_测试=系列测试分割(X_重塑, y_标签, 列车尺寸=0.8, 随机状态=42)

X_列=X_列。重塑(-1,28,28,1)


X_test=X_test.重塑(-1,28,28,1)

是的,它接受四个参数的元组, 如果你有训练图像的数量(或其他)=6000, 图像大小=28x28 和灰度图像 参数为(6000,28,28,1)


最后一个参数是1表示灰度,3表示彩色图像。

得到了同样的问题,没有一个答案对我有效。经过大量调试,我发现一幅图像的大小小于
32
。这会导致具有错误维度的断开数组和上述错误


要解决此问题,请确保所有图像的尺寸正确。

您是如何解决的?只需在图像数据列表周围添加np.asarray()。这会将您提供的列表调整为其预期大小。即使您对单个图像进行预测,数据也会将其包含在列表和np.asarray()中。@AbhishekBhatia您应该以相同的方式更改x_ip_形状。更改输入大小会导致错误更改为“输入0与层conv2d_1不兼容:预期ndim=4,发现ndim=5”。有人需要帮助吗?请使用
image=np。展开_dims(image,axis=0))
添加额外维度描述您所做的事情以及原因。
input_data = input_data.reshape((-1, image_side1, image_side2, channels))