TensorFlow训练出现Sub算子类型不匹配及NoneType不可调用报错咨询
报错解决方案
报错定位
- 第一个
TypeError是核心根因:报错栈明确指向你自定义的损失函数class_loss_regr_fixed_num第53行的减法操作x = y_true[:, :, 4*num_classes:] - y_pred,其中y_true对应切片的类型为int64,模型输出的y_pred为float32,TensorFlow要求二元运算的两个输入张量类型必须一致,因此触发类型不匹配错误。 - 第二个
'NoneType' object is not callable是衍生报错:第一个损失计算失败后没有返回有效张量,返回了空值None,后续训练流程尝试调用损失值做反向传播时就触发了该错误,修复第一个问题后第二个问题会自动消失。
修复方案
方案1(推荐,从数据源统一类型)
在数据加载预处理阶段就把所有输入、标签的类型统一为float32,同时可同步完成归一化操作:
- 如果是numpy格式的数组:
# 图像转float32并归一化 train_images = train_images.astype("float32") / 255.0 # 标签转float32和模型输出对齐 train_labels = train_labels.astype("float32")
- 如果是TensorFlow张量:
train_images = tf.cast(train_images, tf.float32) / 255.0 train_labels = tf.cast(train_labels, tf.float32)
方案2(快速验证,损失函数内临时转换)
如果需要快速验证是否是类型问题导致的报错,可以直接修改损失函数的报错行,强制把y_true的类型转成和y_pred一致的float32:
# 把原报错行替换为以下代码 x = tf.cast(y_true[:, :, 4*num_classes:], tf.float32) - y_pred
验证方法
改完代码后可以先单独测试损失函数:构造两个形状匹配的假y_true和y_pred,分别打印二者的dtype确认类型一致,再调用损失函数确认可以正常返回数值,再启动完整训练流程即可。
内容的提问来源于stack exchange,提问作者Meet Gondaliya
相关产品推荐
相关产品推荐

