CNN图像分割训练报ValueError: Shape must be rank 2 but is rank 4求解
报错根源
你使用的top_k_categorical_accuracy评估指标原生仅支持2维输入张量,格式为[batch_size, 类别数],是为常规图像分类任务设计的。但图像分割场景下,你的模型输出和标注都是4维张量[batch_size, 高, 宽, 类别数],和该指标的输入要求不匹配,因此触发维度错误。
解决方案
可根据需求选择以下任意一种方案:
- 方案1:不需要top-k精度指标时,直接修改模型编译代码,移除
top_k_categorical_accuracy即可正常训练:
theModel.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['categorical_accuracy'])
- 方案2:需要保留top-k精度时,自定义适配4维张量的分割版top-k精度指标,实现逻辑为把4维张量的空间维度展平,转为
[batch_size*高*宽, 类别数]的2维格式后再调用原生计算逻辑:
import tensorflow as tf def seg_top_k_categorical_accuracy(y_true, y_pred, k=2): # 展平H、W维度,适配top_k计算的输入要求 y_pred_flat = tf.reshape(y_pred, (-1, tf.shape(y_pred)[-1])) y_true_flat = tf.reshape(y_true, (-1, tf.shape(y_true)[-1])) return tf.keras.metrics.top_k_categorical_accuracy(y_true_flat, y_pred_flat, k=k) # 编译时传入自定义指标,3分类场景下k可设为2实现top2精度计算 theModel.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['categorical_accuracy', seg_top_k_categorical_accuracy])
内容的提问来源于stack exchange,提问作者Victor Guijarro
相关产品推荐
相关产品推荐

