Keras导出DeepLabV3Plus模型失败:NoneType形状报错
问题:DeepLabV3Plus导出SavedModel时UpSampling2D报错
导出时触发如下错误:
File "C:\Users\u\.pyenv\pyenv-win\versions\3.10.2\lib\site-packages\keras\src\utils\traceback_utils.py", line 731, in error_handler * return fn(*args, **kwargs) TypeError: Exception encountered when calling UpSampling2D.call(). unsupported operand type(s) for *: 'NoneType' and 'int' Arguments received by UpSampling2D.call(): • inputs=tf.Tensor(shape=(None, None, None, 256), dtype=float32)
调用DeepLabV3Plus.from_preset时已指定input_shape=[224,224,3],但模型摘要显示所有层形状均为None,训练脚本如下:
model = keras_cv.models.DeepLabV3Plus.from_preset( "mobilenet_v3_large_imagenet", num_classes=NUM_CLASSES, input_shape=[224,224,3], load_weights=True ) layers_to_train = 1 def disable_training(x): x.trainable = False [disable_training(layer) for layer in model.layers[:-layers_to_train]] model.summary() model.compile( optimizer=keras.optimizers.Adam(learning_rate=LEARNING_RATE), loss=[keras.losses.CategoricalFocalCrossentropy(from_logits=False, alpha=class_weights, gamma=3)], metrics=[keras.metrics.OneHotMeanIoU(num_classes=NUM_CLASSES), 'accuracy']) callback_cyclic = CyclicLR(base_lr = LEARNING_RATE, max_lr = MAX_LEARNING_RATE, step_size=STEP_SIZE, mode = CYCLIC_MODE) history = model.fit(train_dataset, epochs=NUM_EPOCHS, batch_size=NUM_BATCH, validation_data=val_dataset, callbacks=[callback_cyclic]) model.export(savepath_dir+"model.tf")
解决方法
1. 导出前触发模型形状构建
在调用model.export()前,用固定形状的输入跑一次前向传播,让模型确认所有层的具体形状:
# 添加该行代码 model(tf.random.normal((1, 224, 224, 3))) model.export(savepath_dir+"model.tf")
2. 导出时指定输入签名
明确告知模型输入的形状规格,避免动态维度引发的错误:
model.export( savepath_dir+"model.tf", input_signature=tf.TensorSpec(shape=(None, 224, 224, 3), dtype=tf.float32) )
3. 升级依赖版本
部分旧版本的Keras/Keras CV存在动态形状处理bug,升级到最新稳定版可解决问题:
pip install --upgrade keras keras-cv tensorflow
内容的提问来源于stack exchange,提问作者randomdood1923
相关产品推荐
相关产品推荐

