嗨,我正在嘗試構建一個用于分類的簡單 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]
但是它適用于某些影像但不是全部,不知道為什么會發生這種情況
uj5u.com熱心網友回復:
您的一些影像是黑白的,它們只有 2 個維度。使用numpy.atleast_3d. 如果只有 2 個維度,這將添加一個維度,并且不會更改已經有 3 個維度的陣列。
...
im = im.resize((30,30))
im = np.atleast_3d(im)
data.append(im)
...
因此,例如(30, 30, 3),如果您有彩色影像,則不會更改。但是如果你有 shape 的 ab/w 影像(30, 30),它將被重塑為(30, 30, 1)
uj5u.com熱心網友回復:
Conv2d 層需要批量影像,因此請嘗試向輸入添加批量維度。
您可能只以影像的形狀提供輸入影像,例如 (224,224,3) 和 224X224 image_size 中的 3 個顏色通道。
嘗試做:
x_train = np.expand_dims(x_train,axis=0)
這會將影像尺寸從 (224,224,3) 擴展到 (1,224,224,3),添加一個額外的 batch_size 尺寸,如 conv2d 層期望的 4 個尺寸。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/511226.html
標籤:Python张量流喀拉斯
