二分类任务下ELM分类器输出准确率为0的问题求解
问题诱因
- 准确率计算逻辑与二分类设置完全不匹配:当前你设置
num_classes=1,属于单输出二分类模式,但evaluate方法中使用np.argmax(pred, axis=-1)计算预测类别。对于形状为(N,1)的输出数组,沿最后一维取argmax的结果恒为0,只要真实标签不全为0,准确率会直接为0。 - 标签格式与模型输出、损失函数不匹配:若真实标签Y为one-hot编码的二分类格式(形状为(N,2)),但模型输出维度为1,维度完全不匹配,不仅准确率计算全错,二元交叉熵损失的计算也会出现异常,导致模型权重拟合失败。
- 单输出二分类后处理逻辑缺失:sigmoid激活的单输出结果为0-1区间的概率值,需要设置阈值(通常为0.5)判断最终类别,你当前代码完全没有这一步处理,直接使用针对多分类的argmax逻辑,完全不适配当前场景。
排查解决步骤
- 修正准确率计算逻辑(适配单输出二分类)
若你坚持使用单输出二分类模式,将evaluate中的准确率计算代码替换为:
同时确认Y的形状为(N,1),标签取值为0或1,与二元交叉熵损失的输入要求匹配。acc = np.sum((pred > 0.5).astype(int) == Y) / len(Y) - 调整模型参数适配one-hot编码标签
若你的标签是形状为(N,2)的one-hot编码,将num_classes修改为2,此时原有argmax的准确率计算逻辑可正常使用,损失函数可替换为分类交叉熵,或保持二元交叉熵适配多标签场景。 - 验证输入输出维度匹配
训练前打印X、Y的形状,确认X的形状为(N,25),与模型输入维度匹配;Y的形状与模型输出维度num_out_units完全一致。 - 优化伪逆计算的数值稳定性
为避免隐藏层矩阵奇异导致权重计算异常,可在伪逆计算时添加L2正则项,替换原有伪逆逻辑:reg_lambda = 1e-5 H_pinv = np.linalg.inv(H.T @ H + reg_lambda * np.eye(H.shape[1])) @ H.T - 验证中间输出合理性
打印训练后的预测值pred的取值范围,确认sigmoid激活输出分布在0-1之间,没有出现数值溢出、全部收敛到0或1的异常情况。
内容的提问来源于stack exchange,提问作者ubuntu_noob
相关产品推荐
相关产品推荐

