TensorFlow DeepLab3+微调新数据集后评估出现形状不匹配错误
解决DeepLab3+微调新数据集时评估阶段的形状不匹配问题
我之前也碰到过类似的DeepLab微调后评估报错的情况,结合你的描述——训练正常但评估出现形状不匹配,而且是基于TF-Slim实现的模型,问题大概率出在训练与评估环节的输入管道不一致、类别数变更后的模型输出与标签不匹配,或者TF-Slim相关预处理/评估函数的配置上。下面是具体的排查和解决步骤:
1. 对齐训练与评估的图像尺寸预处理策略
你遇到的第一个错误“Expected [x,x,3], got [y,y,3]”,核心是评估时输入图像的尺寸和模型期望的不匹配。要知道DeepLab训练时可能会用动态尺寸输入(比如支持不同大小的图像),但评估脚本如果硬编码了固定的resize尺寸,就会和实际输入的图像形状冲突:
- 检查训练和评估脚本中调用的TF-Slim预处理函数(比如
slim.preprocessing.preprocess_image),确保output_height、output_width参数完全一致,不要在评估时单独设置不同的尺寸; - 如果训练时用了随机裁剪、缩放等数据增强,评估时要改成仅resize到统一尺寸(不要随机裁剪),但尺寸数值必须和训练时的目标尺寸对齐;
- 避免用
tf.reshape强制改变图像形状,改用tf.image.resize_images来调整尺寸,前者会破坏图像的空间结构,容易引发形状不匹配。
2. 确认类别数变更后的形状匹配
因为你换了类别数不同的新数据集,这是很容易忽略的点:
- 检查模型最后一层卷积的输出通道数:原DeepLab默认是21类(PASCAL VOC),你需要改成新数据集的类别数N,确保模型输出的logits形状是
[batch_size, height, width, N]; - 检查评估时的标签预处理:如果用的是稀疏标签(每个像素是类别索引),标签形状应该是
[batch_size, height, width];如果是one-hot编码,标签形状要和logits一致([batch_size, height, width, N])。如果评估时标签的维度或空间尺寸和logits不匹配,就会触发InvalidArgumentError; - 查看TF-Slim损失函数的调用,比如
slim.losses.softmax_cross_entropy,确认传入的logits和labels形状符合函数要求。
3. 检查TFRecords读取的形状解析逻辑
训练时TFRecords写入的图像/标签是可变尺寸,但评估读取时如果错误地强制reshape成固定形状,就会报错:
- 打开评估脚本的
parse_example函数,确认解析图像和标签时,没有硬编码固定的形状值。比如图像应该解析成tf.float32类型的张量,形状设为[None, None, 3],标签设为[None, None](稀疏标签),保留动态尺寸; - 读取后再统一做resize处理,确保进入模型前的图像和标签空间尺寸一致。
4. 验证模型输出与输入的形状对应
可以临时写一段测试代码,手动输入一张新数据集的图像到模型中,打印模型输出logits的形状,和评估时的标签形状对比:
import tensorflow as tf from deeplab_model import build_deeplab_model # 替换为你的模型构建函数 # 加载一张测试图像 test_image = tf.image.decode_jpeg(tf.io.read_file("test_image.jpg")) test_image = tf.expand_dims(test_image, 0) # 增加batch维度 test_image = tf.image.resize(test_image, [513, 513]) # 用训练时的目标尺寸 # 构建模型并获取输出 logits = build_deeplab_model(test_image, num_classes=YOUR_NEW_NUM_CLASSES, is_training=False) print("Logits shape:", logits.shape) # 打印测试标签的形状 test_label = tf.io.read_file("test_label.png") test_label = tf.image.decode_png(test_label, channels=1) test_label = tf.expand_dims(test_label, 0) test_label = tf.image.resize(test_label, [513, 513], method=tf.image.ResizeMethod.NEAREST_NEIGHBOR) print("Label shape:", test_label.shape)
如果两者的空间维度(height, width)不一致,说明模型的上采样/ASPP模块没有正确恢复尺寸,或者预处理时的resize策略有问题。
5. 检查TF-Slim评估函数的配置
如果你用了slim.evaluation.evaluate_once这类TF-Slim内置评估函数,要确认输入占位符的设置是否支持动态尺寸:
- 不要把图像占位符的形状硬编码成
[batch_size, 513, 513, 3],改成[None, None, None, 3],标签占位符改成[None, None, None],这样可以适配不同尺寸的输入; - 确保评估时的batch_size设置和训练时一致,或者如果评估用batch_size=1,也要确认模型支持单样本输入。
内容的提问来源于stack exchange,提问作者georgos
相关产品推荐
相关产品推荐

