TensorFlow1.5.0二分类任务中mean_per_class_accuracy报形状不兼容错误求助
解决TensorFlow 1.5.0中
tf.metrics.mean_per_class_accuracy()的形状不兼容问题 这个错误ValueError: Shapes (?,) and (?, 1) are incompatible本质是输入的真实标签(y_true)和预测结果(y_pred)形状不匹配——tf.metrics.accuracy()内部做了自动形状兼容处理,但mean_per_class_accuracy()在TF1.5版本里对输入形状要求更严格,必须保证两者维度完全一致。
具体解决步骤:
先确认输入形状
先打印出y_true和y_pred的形状,明确哪一个是二维的((?,1)),哪一个是一维的((?,)):print("y_true shape:", tf.shape(y_true)) print("y_pred shape:", tf.shape(y_pred))统一输入形状与数据类型
用tf.squeeze()把二维的张量压缩成一维(去除最后一个维度为1的轴),同时注意:mean_per_class_accuracy()要求输入是类别索引(整数),不是概率分布或one-hot编码。如果你的y_pred是模型输出的概率(比如形状为(?,2)),需要先通过tf.argmax()转成类别索引。示例修正后的代码:
# 处理真实标签:如果是(?,1)就压缩成(?,) y_true_squeezed = tf.squeeze(y_true, axis=-1) # 处理预测结果:如果是概率分布,转成类别索引(形状变为(?,)) y_pred_classes = tf.argmax(y_pred, axis=-1) eval_metric_ops = { "accuracy": tf.metrics.accuracy(y_true, y_pred), "mean_per_class_accuracy": tf.metrics.mean_per_class_accuracy( labels=y_true_squeezed, predictions=y_pred_classes, num_classes=2 # 二分类任务,这里填2 ) }验证逻辑
修正后再运行,形状不匹配的问题应该就能解决。本质上是TF1.5的这个metric函数没有自动处理形状差异,需要我们手动对齐输入维度和数据类型。
内容的提问来源于stack exchange,提问作者hannahrae
相关产品推荐
相关产品推荐

