我的输入形状是正确的,但我仍然得到以下错误:顺序层的输入 0 与层不兼容::预期 min_ndim=4,

My Input shape is correct but I stil l get the following err.: Input 0 of layer sequential is incompatible with the layer: : expected min_ndim=4,

这是我的模型:

def make_model():
model = Sequential()

model.add(Conv2D(kernel_size=(3, 3), filters=16, input_shape=(32, 32,1), padding='same'))
model.add(LeakyReLU(0.1))

model.add(Conv2D(kernel_size=(3, 3), filters=32, padding='same'))
model.add(LeakyReLU(0.1))

model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Conv2D(kernel_size=(3, 3), filters=32, padding='same'))
model.add(LeakyReLU(0.1))

model.add(Conv2D(kernel_size=(3, 3), filters=64, padding='same'))
model.add(LeakyReLU(0.1))

model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Flatten())

model.add(Dense(256))
model.add(LeakyReLU(0.1))
model.add(Dropout(0.5))

model.add(Dense(10))
model.add(Activation('softmax'))
return model

编译部分:

INIT_LR = 5e-3  # initial learning rate
BATCH_SIZE = 32
EPOCHS = 10
from tensorflow.keras import backend as K
K.clear_session()
model = make_model()
model.compile(
loss='categorical_crossentropy',  # we train 10-way classification
optimizer=tf.keras.optimizers.Adamax(lr=INIT_LR),  # for SGD
metrics=['accuracy']  # report accuracy during training
)

def lr_scheduler(epoch):
    return INIT_LR * 0.9 ** epoch

# callback for printing of actual learning rate used by optimizer
class LrHistory(keras.callbacks.Callback):
    def on_epoch_begin(self, epoch, logs={}):
        print("Learning rate:", K.get_value(model.optimizer.lr))

配件:

 model.fit(
X_train.reshape(-1, 32, 32, 1), y_train,  # prepared data
batch_size=BATCH_SIZE,
epochs=EPOCHS,
callbacks=[keras.callbacks.LearningRateScheduler(lr_scheduler), 
           LrHistory(), 
           tfa.callbacks.TQDMProgressBar() ],
validation_data=(X_test, y_test),
shuffle=True,
verbose=0,
initial_epoch=None or 0

)

我的Data_trainX体型:

我的Data_trainy形状

我的输入形状与模型 Conv2D 层的输入形状兼容。 我已经查看了有关应用这些解决方案的其他问题,但没有用。 对我来说似乎一切都是正确的。我哪里做错了?

虽然您正在重塑训练数据 X_train 以适应模型规范,但您并没有对验证数据进行此操作 X_test

也重塑 X_test,它应该可以正常工作:

model.fit(
    X_train.reshape(-1, 32, 32, 1), y_train,
    ...
    validation_data=(X_test.reshape(-1, 32, 32, 1), y_test),  # <-- apply changes here
    ...
)