我正在Java中实现一个神经网络,它只使用完全连接的层。
我正在使用简单的正弦函数训练网络,其中x
(在[0,1]中)作为输入给出,并且
(1 + Math.sin(x * 2 * Math.PI))/2
作为输出。
如图所示,错误看起来会降低到10%左右,据我所知,这对于这样的网络来说并不算太糟糕。该图显示了每200次迭代的平均值。
在测试特定值时,我会遇到很大的错误。他们说从0.1%到数千%。虽然平均而言它们看起来与训练曲线给出的值相近,但网络确实在每十次测试中失败。
我的问题是:网络出现这种不稳定行为是否“正常”?这样的问题是否常见于这一系列的错误,即使它们似乎不经常“如此”出现?我认为反应会“更顺畅”,这就是我要问的原因。
感谢任何反馈,非常感谢!
编辑:
1)我在测试阶段获得错误百分比:
Math.abs((networkOutput-expectedOutput)/expectedOutput)*100
。我只使用expectedOutput而不是此错误百分比进行培训。
2)关于培训:简而言之,我运行这个循环:
double input = Math.random();
double output = trainingFunction(input);
net.backPropagate(input, output);
使用trainingFunction返回上面看到的规范化正弦函数,backPropagate首先执行网络,然后使用梯度下降方法和sigmoid的导数来计算权重的delta。
3)拓扑结构是1输入神经元 - > 20个隐藏的神经元 - > 1输出神经元。当使用更多隐藏层时,我也注意到了同样的结果。