Keras模型评估报错:numpy.int32对象不可迭代求解决
解决
numpy.int32 object is not iterable错误 错误原因
你的代码报错核心是model.predict(test_img_pca)返回的数组维度不符合预期:
- 若为二分类任务且模型最后一层用
sigmoid激活,返回的是形状为(样本数,)的一维数组,每个元素是0-1之间的概率值。此时遍历prediction时,每个row是单个numpy.int32/float值,调用max(row)会触发错误——单个数值不是可迭代对象,无法计算最大值。 - 若为多分类任务,则说明模型输出维度错误(比如最后一层输出神经元数不等于类别数),导致
prediction不是二维数组。
解决方案
根据任务类型选择对应的修改方式:
1. 多分类任务
直接使用np.argmax()高效获取每个样本的预测类别,替代低效且易出错的列表推导式:
from sklearn.metrics import accuracy_score, auc, f1_score, recall_score import numpy as np prediction = model.predict(test_img_pca) # 沿axis=1维度取最大值对应的索引,即预测类别 prediction_cat = np.argmax(prediction, axis=1) acc_krr = accuracy_score(y_test_cat, prediction_cat) print("Accuracy: ", acc_krr) rcl_krr = recall_score(y_test_cat, prediction_cat, average = None) print("Recall: ", rcl_krr) f1_krr = f1_score(y_test_cat, prediction_cat, average = None) print("F1: ", f1_krr)
2. 二分类任务
通过阈值(通常取0.5)将概率值转换为类别标签:
from sklearn.metrics import accuracy_score, auc, f1_score, recall_score import numpy as np prediction = model.predict(test_img_pca) # 用0.5作为阈值,将概率转为0/1类别,flatten确保形状与y_test_cat匹配 prediction_cat = (prediction > 0.5).astype(int).flatten() acc_krr = accuracy_score(y_test_cat, prediction_cat) print("Accuracy: ", acc_krr) rcl_krr = recall_score(y_test_cat, prediction_cat, average = None) print("Recall: ", rcl_krr) f1_krr = f1_score(y_test_cat, prediction_cat, average = None) print("F1: ", f1_krr)
额外检查
如果是多分类任务但输出维度异常,需确认模型最后一层配置:
- 输出神经元数量等于数据集的类别总数
- 激活函数使用
softmax(多分类场景标准配置)
内容的提问来源于stack exchange,提问作者uyot10
相关产品推荐
相关产品推荐

