keras ValueError:层“sequential_1”的输入0与该层不兼容:预期形状=(None,28,28,1),找到的形状=(None,3,28,28,1)

osh3o9ms  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(138)
image_w = 28
image_h = 28
  
X = []
Y = []
  
for idex, categorie in enumerate(categories):
    label = [0 for i in range(num_classes)]
    label[idex] = 1
    image_dir = img_path + categorie + '/'
  
    for top, dir, f in os.walk(image_dir):
        for filename in f:
            img = cv2.imread(image_dir+filename)
            img = cv2.resize(img, None, fx=image_w/img.shape[1], fy=image_h/img.shape[0])
            img=img/256
            X.append(img.reshape(-1,28,28,1))
            Y.append(label)
 
X = np.array(X)
Y = np.array(Y)
 
train_input, test_input, train_target, test_target = train_test_split(X,Y)
model = keras.Sequential()
model.add(keras.layers.Conv2D(32, kernel_size=3, activation='relu', padding='same', input_shape=(28,28,1)))
model.add(keras.layers.MaxPooling2D(2))
model.add(keras.layers.Conv2D(64, kernel_size=3, activation='relu', padding='same'))
model.add(keras.layers.MaxPooling2D(2))
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(100, activation='relu'))
model.add(keras.layers.Dropout(0.4))
model.add(keras.layers.Dense(3, activation='softmax'))
model.summary()
train_scaled = np.append(train_input, test_input, axis=0)
train_target = np.append(train_target, test_target, axis=0)

model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics='accuracy')
checkpoint_cb=keras.callbacks.ModelCheckpoint('best-cnn-model.h5', save_best_only=True)
early_stopping_cb=keras.callbacks.EarlyStopping(patience=2, restore_best_weights=True)
history=model.fit(train_scaled, train_target, epochs=20, validation_split=0.1, batch_size=4, callbacks=[checkpoint_cb, early_stopping_cb])

ValueError:层“sequential_1”的输入0与该层不兼容:预期形状=(None,28,28,1),发现形状=(None,3,28,28,1)创建对图像进行分类的CNN模型。在稍微修改模型的过程中发生了错误,该模型使用时尚Mnist数据进行了良好的工作。
我试图修改Dense图层的数量或Conv2D图层的大小,但我无法修复它,因为输入图层和输出图层的大小不同。

yrefmtwq

yrefmtwq1#

错误在于准备图像和堆叠它们,特别是在这一行:

X.append(img.reshape(-1,28,28,1))

因为我认为你的图像是RGB的,这意味着它们有3个通道,这意味着它们的形状是(28,28,3),所以当你应用之前的整形时,结果图像将具有形状(3,28,28,1)。而input_layer期望的数据是(28,28,1)。
要解决这个问题,你必须禁用这个整形,要么使用单通道数据,保持你的input_layer不变,要么使用3通道,然后为你的input_layer分配shape=(28,28,3)。

相关问题