训练目标检测模型出现_dummy_computation_fn调用栈报错如何解决?
错误信息:
错误可能源自某一输入操作。与节点ResNet101V1_FPN/model/conv1_conv/Conv2D关联的输入源操作:ResNet101V1_FPN/model/lambda/Pad(定义于 /local/lib/python3.7/dist-packages/object_detection/models/keras_models/resnet_v1.py:51)
函数调用栈:_dummy_computation_fn
报错原因排查
- 输入图像尺寸不符合下采样约束:ResNet101V1 backbone 共包含5次步长为2的下采样,要求输入图像的长宽必须是32的整数倍,否则Pad层的补零逻辑和后续Conv2D的步长计算不匹配,触发计算图校验阶段的dummy函数报错。
- 输入通道数不匹配:ResNet101V1默认接收3通道RGB输入,若传入单通道灰度图、4通道RGBA图像,Pad操作输出的张量通道数和Conv2D层预设的输入通道数不一致,会触发维度校验失败。
- 预处理逻辑异常:自定义预处理步骤中如果误将默认的HWC(通道在后)张量格式转为CHW(通道在前),或者缩放、裁剪操作后没有对齐维度,也会导致Pad层输出维度不符合后续卷积层的要求。
解决方案
- 调整输入图像尺寸为32的整数倍:在数据预处理阶段添加尺寸对齐逻辑,参考代码如下:
import tensorflow as tf def align_image_size(image, target_short_side=640): h, w = tf.shape(image)[0], tf.shape(image)[1] scale = target_short_side / tf.cast(tf.minimum(h, w), tf.float32) # 对齐到32的整数倍 new_h = tf.cast(tf.round(h * scale / 32) * 32, tf.int32) new_w = tf.cast(tf.round(w * scale / 32) * 32, tf.int32) return tf.image.resize(image, (new_h, new_w))
- 统一输入通道数:在数据加载阶段添加通道校验,单通道图像复制为3通道,4通道图像提取前3通道,确保输入张量最后一维固定为3。
- 校验张量格式:检查自定义预处理逻辑,不要将HWC格式的张量转为CHW格式,保持和TF Object Detection API的默认格式一致。
- 调整训练配置文件:如果使用官方预置配置训练,检查
image_resizer模块参数,使用fixed_shape_resizer时直接设置尺寸为32的整数倍(如640x640、800x800);使用keep_aspect_ratio_resizer时确保pad_to_max_dimension参数值为32的整数倍。
内容的提问来源于stack exchange,提问作者Ahmad Abubakar
相关产品推荐
相关产品推荐

