使用ImageDataGenerator结合MobileNet计算图像分类指标报错求助
问题解决:ImageDataGenerator格式下计算分类指标
错误原因
- 维度不匹配:
tf.math.argmax(y_pred_logits)默认按axis=0计算,返回的是每个类别维度的最大值索引(形状为(10,)),但test_batches.classes是测试集所有样本的真实标签(形状为(1887,)),两者样本数不一致导致报错。 - 多分类指标参数缺失:你的任务是10分类,sklearn的
precision_score等函数默认针对二分类,必须指定average参数定义多分类下的指标计算方式。
修改后的完整代码
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score # 生成预测结果 y_pred_logits = model.predict(test_batches) # 按每个样本维度(axis=1)取最大值索引,得到每个样本的预测类别 y_pred = tf.math.argmax(y_pred_logits, axis=1).numpy() # 转成numpy数组方便后续计算 # 获取测试集真实标签 test_classes = test_batches.classes # 计算指标 accuracy = accuracy_score(test_classes, y_pred) print('Accuracy: %f' % accuracy) # 多分类场景下指定average参数,可选值: # - 'macro': 对每个类别单独计算后取平均 # - 'weighted': 按类别样本数量加权平均 # - 'micro': 计算全局的tp、fp、fn后计算指标 precision = precision_score(test_classes, y_pred, average='weighted') print('Precision: %f' % precision) recall = recall_score(test_classes, y_pred, average='weighted') print('Recall: %f' % recall) f1 = f1_score(test_classes, y_pred, average='weighted') print('F1 score: %f' % f1)
关键说明
shuffle=False必须保留:你在加载test_batches时已经设置了shuffle=False,这很重要——确保预测结果的顺序和test_batches.classes的标签顺序完全对应,否则指标计算会完全错误。average参数选择:根据你的任务需求选择:- 若所有类别重要性相同,选
'macro'; - 若类别样本不平衡,选
'weighted'更合理; - 若关注全局整体表现,选
'micro'。
- 若所有类别重要性相同,选
内容的提问来源于stack exchange,提问作者Bet
相关产品推荐
相关产品推荐

