Python加载Sequential模型时遇输入通道维度未定义错误
解决Keras加载模型时通道维度为None的错误
错误原因
你把input_shape=(IMG_SIZE,IMG_SIZE,3)定义在了Conv2D层,但模型前两层(Resizing、Rescaling)没有明确的输入形状约束,导致模型保存时无法记录完整的输入维度信息。加载时Keras无法推断输入的通道数,因此报错通道维度为None。
解决方案
方案1:重新定义模型并训练(推荐)
将输入形状定义在模型的第一层,使用Input层明确整个模型的输入维度,确保所有层都能正确识别输入通道数:
model = Sequential([ layers.Input(shape=(IMG_SIZE, IMG_SIZE, 3)), # 明确模型输入形状 layers.Resizing(IMG_SIZE, IMG_SIZE), layers.Rescaling(1./255), layers.Conv2D(filters=32, kernel_size=(3, 3), activation='relu', padding='same'), layers.Dropout(0.2), layers.BatchNormalization(), layers.MaxPool2D(pool_size=(2, 2)), layers.Conv2D(filters=64, kernel_size=(3, 3), activation='relu', padding='same'), layers.BatchNormalization(), layers.MaxPool2D(pool_size=(2, 2)), layers.Conv2D(filters=128, kernel_size=(3, 3), activation='relu', padding='same'), layers.BatchNormalization(), layers.MaxPool2D(pool_size=(2, 2)), layers.Conv2D(filters=256, kernel_size=(3, 3), activation='relu', padding='same'), layers.BatchNormalization(), layers.MaxPool2D(pool_size=(2, 2)), layers.Flatten(), layers.Dropout(0.2), layers.Dense(300, activation='relu'), layers.Dense(150, activation='relu'), layers.Dense(n_classes, activation='softmax') ]) # 后续训练、保存代码不变 EPOCHS = 50 BATCH_SIZE = 8 history = model.fit(x=train_batches, validation_data=validation_batches, steps_per_epoch=len(train_batches), validation_steps=len(validation_batches), epochs=EPOCHS, batch_size=BATCH_SIZE) model.save('my_model.h5')
重新训练保存后,执行model=tf.keras.models.load_model('my_model.h5')即可正常加载。
方案2:不重新训练,修复已保存的模型
如果不想重新训练,可以通过重新构建输入层的方式修复模型,但这种方法存在兼容性风险:
import tensorflow as tf from tensorflow.keras.models import load_model from tensorflow.keras.layers import Input, Model # 加载原模型(不编译) model = load_model('my_model.h5', compile=False) # 重新定义输入层 input_layer = Input(shape=(IMG_SIZE, IMG_SIZE, 3)) # 连接原模型的所有层 x = input_layer for layer in model.layers: x = layer(x) # 创建新模型并加载原权重 new_model = Model(inputs=input_layer, outputs=x) new_model.set_weights(model.get_weights()) # 可选择编译模型 new_model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
关键说明
input_shape参数是用来指定当前层的输入形状,而非整个模型的输入形状。当模型的起始层没有明确输入约束时,Keras无法完整记录模型的输入维度信息,导致加载时出现通道维度缺失的错误。始终在模型的第一层明确输入形状,是避免这类问题的最佳实践。
内容的提问来源于stack exchange,提问作者Ant2198
相关产品推荐
相关产品推荐

