完全相同的Python神经网络代码运行结果差异巨大排查
问题原因
两份代码的核心逻辑并不一致,你的手写代码存在一处Python缩进错误,和VS Code编辑器无关,这是准确率异常的根本原因。
你的代码中feedforward前向传播方法的实现存在缩进问题:
def feedforward(self, a): for b, w in zip(self.biases, self.weights): a = sigmoid(np.dot(w, a)+b) return a
return a被错误缩进放在了for循环内部,代码执行时只会完成第一层(输入层到隐藏层)的计算,拿到30维的隐藏层输出就直接返回,根本不会执行后续隐藏层到输出层的计算,相当于你实际运行的是一个截断的残缺网络。此时对30维的隐藏层输出取argmax得到的索引范围是029,而测试集标签范围是09,自然匹配率极低,刚好落在你观察到的单epoch50~450正确数的区间。
官方源码的对应实现缩进是正确的:
def feedforward(self, a): for b, w in zip(self.biases, self.weights): a = sigmoid(np.dot(w, a)+b) return a
return a和for循环保持同级,会等所有网络层的前向计算全部完成后,才返回10维的输出层结果,网络结构完整,因此能达到8000~9500的正常识别准确率。
修复方案
将你手写代码中feedforward方法里的return a语句向外缩进一层,和for循环对齐,修改后重新运行即可得到和官方源码一致的效果。
额外提示
你使用的文本对比工具没有检出这个问题,是因为没有严格校验缩进级别。Python是强制缩进的语言,同一行代码缩进位置不同,执行逻辑会有本质区别,缩进错误是Python开发中非常常见的低级问题,排查代码逻辑问题时需要优先检查缩进是否符合预期。
内容的提问来源于stack exchange,提问作者thrazaurus
相关产品推荐
相关产品推荐

