Simple Neural Network(形状图像识别)输出相同结果问题求助
形状检测简易神经网络固定输出问题排查方案
你提供的推理代码如下:
corrects, wrongs = 0, 0 print('Target', ' Predicted', ' %') for i in range(len(x_test)): input_vector = np.array(x_test[i], ndmin=2).T output_vector = np.dot(wh, input_vector) output_vector = sigmoid(output_vector) output_vector = np.dot(wo, output_vector) res = sigmoid(output_vector) #Evaluate Model res_max = res.argmax() e = np.array(res_max) e = np.eye(3)[res_max] e.astype('int32') if np.array_equal(e,y_test[i]) : corrects += 1 else: wrongs += 1 print(y_test[i], ' ',e, ' ', np.max(res)) print("accuracy:", corrects / ( corrects + wrongs))
可按以下顺序逐步排查定位问题:
- 输入侧验证:打印不同测试样本的
input_vector,确认输入数据确实存在差异,排除测试集加载错误、所有样本重复的问题;检查输入数据是否做了归一化,若直接输入0-255的原始像素值,矩阵点乘后数值过大会导致sigmoid进入饱和区,输出区分度极低,看起来就像所有结果完全一致。 - 权重逻辑排查:确认推理时调用的
wh、wo是训练完成后保存的权重,而非随机初始化的未训练参数;检查权重初始化逻辑,不能全初始化为0或完全相同的数值,否则所有神经元更新路径一致,输出不会产生差异;如果初始化范围过大,也会直接导致sigmoid饱和,训练阶段参数无法正常更新。 - 训练流程校验:检查反向传播的梯度计算逻辑,确认sigmoid导数实现正确,没有出现梯度消失或梯度爆炸的情况;调整学习率大小,学习率过小参数几乎不更新,学习率过大参数会偏离合理区间,都会导致输出固定;检查损失函数是否匹配3分类任务,错误的损失函数会让模型优化方向完全偏离预期。
- 数据集分布检查:统计训练集的类别分布,若某一类样本占比过高,模型会倾向于直接全部预测为该类获取最高训练准确率,不会学习其他类的特征。
- 最小单元测试:手动构造两个差异极大的自定义向量输入模型,观察输出是否有差异。如果输出仍然完全相同,直接定位为模型权重或计算逻辑的问题;如果输出存在差异,说明问题出在数据集或预处理环节。
内容的提问来源于stack exchange,提问作者DARDAR SAAD
相关产品推荐
相关产品推荐

