keras ValueError:层conv2d的输入0与层不兼容:预期的ndim=4,找到的ndim=3,收到的完整图形:【无、30、30】

rdrgkggo  于 2022-11-13  发布在  其他
关注(0)|答案(2)|浏览(132)

你好,我试图建立一个简单的CNN模型,用于分类。我得到了下面的错误。提前感谢帮助

path=os.listdir(imgs_path)
    data = []
    labels = []
    flag=0
    classes = len(list_dir)
    for i in path:
        img_path = imgs_path +i + os.sep
        for img in os.listdir(img_path):
            im = Image.open(img_path + os.sep + img)
            im = im.resize((30,30))
            im = np.array(im)
            data.append(im)
            labels.append(flag)
        flag=flag+1
    x_train = np.array(data)
    y_train = np.array(labels)
    model = Sequential()
    model.add(Conv2D(filters=32, kernel_size=(5,5), activation="relu",input_shape=x_train.shape[1:]))
    model.add(Conv2D(filters=32, kernel_size=(5,5), activation="relu"))
    model.add(MaxPool2D(pool_size=(2,2)))
    model.add(Dropout(rate=0.25))
    model.add(Conv2D(filters=64, kernel_size=(3,3), activation="relu"))
    model.add(Conv2D(filters=64, kernel_size=(3,3), activation="relu"))
    model.add(MaxPool2D(pool_size=(2,2)))
    model.add(Dropout(rate=0.5))
    model.add(Flatten())
    model.add(Dense(256, activation="relu"))
    model.add(Dropout(rate=0.25))
    model.add(Dense(classes, activation="softmax"))

    model.compile(loss="sparse_categorical_crossentropy", optimizer="adam", metrics=["accuracy"])

ValueError: Input 0 of layer conv2d is incompatible with the layer: expected ndim=4, found ndim=3. Full shape received: [None, 30, 30]

然而,它适用于一些图像,但不是所有,不知道为什么会发生这种情况

nhjlsmyf

nhjlsmyf1#

你的一些图像是B的,它们只有2维。使用numpy.atleast_3d。如果只有2维,这将增加一个维,并且不会改变已经有3维的数组。

...
im = im.resize((30,30))
im = np.atleast_3d(im)
data.append(im)
...

因此,如果您有一个彩色图像,例如(30, 30, 3),它将不会被更改。但是如果您有一个黑白图像,形状为(30, 30),它将被重新整形为(30, 30, 1)

s71maibg

s71maibg2#

Conv2d图层需要批处理图像,因此请尝试向输入中添加批处理维度。
您可能仅以图像的形状提供输入图像,例如(224,224,3),如具有3个颜色通道的224X224 image_size。
尝试执行以下操作:

x_train = np.expand_dims(x_train,axis=0)

这将把图像维度从(224,224,3)扩展到(1,224,224,3),添加额外的batch_size维度,如Conv2D层所期望的4个维度。

相关问题