神经网络反向传播算法在Python中不工作

我在Python中编写了一个神经网络,参考了这里的示例。看起来反向传播算法不起作用,因为在训练了1万次后,神经网络无法生成正确的值(在误差范围内)。具体来说,我在以下示例中训练它计算正弦函数:

(代码略)

输出未能接近tanh(sin(3)) = 0.140190616。我怀疑涉及错误的索引或对齐的问题,但Numpy并未引发此类错误。有什么建议可以告诉我哪里出错了?

编辑: 我忘了添加偏置神经元。这是更新后的代码:

(代码略)

回答:

我认为您训练神经网络的方式有误。您有一个10000次迭代的循环,并且在每个周期中输入一个新样本。在这种情况下,神经网络永远不会被训练。

(该陈述是错误的!请查看更新!)

您需要做的是生成一个包含真实样本的大型数组Y = sin(X),将其一次性提供给您的网络,并在训练集上进行前向和后向迭代,以最小化成本函数。为了检查算法,您可能需要绘制成本函数随迭代次数的变化,并确保成本下降。

另一个重要点是权重的初始化。您的数字相当大,网络将需要很长时间才能收敛,特别是在使用低学习率时。一种好的做法是将初始权重均匀生成在某个小范围内[-eps .. eps]

在我的代码中,我实现了两种不同的激活函数:sigmoid()tanh()。您需要根据所选的函数缩放输入:分别为[0 .. 1][-1 .. 1]

以下是一些图像,展示了sigmoid()tanh()激活函数的成本函数和结果预测:

sigmoid激活

tanh激活

如您所见,sigmoid()激活的效果比tanh()略好一些。

此外,当使用网络[1, 6, 1]时,我得到了更好的预测结果,与具有4层的更大网络[1, 6, 4, 1]相比。因此,神经网络的大小并不总是关键因素。以下是提到的大型网络的预测结果:

更大网络的sigmoid

这是我的代码,附带了一些注释。我尽量在可能的情况下使用了您的符号表示法。

(代码略)

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注