我正在尝试用Python编程实现一个带有反向传播的神经网络。
通常会收敛到1。图像左侧有一些delta值。它们非常小,应该更大吗?你知道为什么会发生这种收敛的情况吗?
有时候它会朝某个点的方向上升,然后又下降
这是完整的代码:http://pastebin.com/9BiwhWrD 反向传播代码从第146行开始(第165行的根相关代码什么也没做,之前只是在尝试一些想法)
有什么可能出错的地方吗?你有没有见过这样的行为?
非常感谢你。
回答:
发生这种情况的原因是输入数据太大。激活的Sigmoid函数在x趋于无穷大时收敛到f(x)=1。我不得不对数据进行归一化处理
例如:
a = np.array([1,2,3,4,5])a /= a.max()
或者根本不生成未归一化的数据。
此外,中间值在应用Sigmoid之前就被更新了。但是Sigmoid的导数看起来是这样的:y'(x) = y(x)-(1-y(x))。在我这里,它只是:y'(x) = x-(1-x)
在计算delta值后更新权重的方式上也有错误。我根据Python神经网络的教程重写了整个循环,然后它就工作了。
它仍然不支持偏置,但可以进行分类。对于回归,它不够精确,但我猜这与缺少偏置有关。
这是代码:http://pastebin.com/hRCKe1dK
有人建议我将训练数据放入神经网络框架中,看看它是否能工作。但它没有。所以很明显这与之有关,因此我想到它应该在-1和1之间。