我正在使用前馈、反向传播、多层神经网络,我使用 sigmoid 函数作为激活函数,其范围为 -1 到 1。但最小误差不会低于 5.8,我想要的更少,你可以看到输出经过 100000 次迭代。
我认为这是因为我的输出范围高于 1,而 sigmoid 函数的范围仅为 -1 到 1。任何人都可以建议我如何克服这个问题,因为我想要的输出范围是 0 到 2.5。建议我哪个激活函数最适合这个范围。
我正在使用前馈、反向传播、多层神经网络,我使用 sigmoid 函数作为激活函数,其范围为 -1 到 1。但最小误差不会低于 5.8,我想要的更少,你可以看到输出经过 100000 次迭代。
我认为这是因为我的输出范围高于 1,而 sigmoid 函数的范围仅为 -1 到 1。任何人都可以建议我如何克服这个问题,因为我想要的输出范围是 0 到 2.5。建议我哪个激活函数最适合这个范围。
如果你想减少输出错误,在调整节点的激活函数之前有几件事需要考虑。
首先,你有一个偏置节点吗?偏置节点有几个含义,但是 - 与本讨论最相关 - 它们允许将网络输出转换为所需的输出范围。正如该参考文献所述:
在神经网络中使用偏差增加了网络解决问题的能力,方法是允许分离各个类的超平面被偏移以获得更好的定位。
这篇文章提供了一个很好的讨论: 偏置在神经网络中的作用。这个也很好:为什么在 ANN 中需要 BIAS?我们应该为每一层设置单独的 BIAS 吗?
第二种方法:它通常有助于标准化您的输入和输出。正如您所注意到的,您的 sigmoid 提供了 +/- 1 的范围。当尝试学习范围为 0 到 1000(例如)的函数时,这个小范围可能会出现问题。为了帮助学习,通常缩放和转换输入以适应节点激活函数。在此示例中,可以将范围除以 500,得到 0 到 2 的范围,然后从该范围中减去 1。通过这种方式,输入已被归一化为 -1 到 1 的范围,这更好地拟合了激活函数。请注意,网络输出应该是非规范化的:首先,将 +1 加到输出上,然后乘以 500。
在您的情况下,您可以考虑将输入缩放 0.8,然后从结果中减去 1。然后将 1 添加到网络输出,然后乘以 1.25 以恢复所需的范围。请注意,此方法可能最容易完成,因为它不会像添加偏置那样直接更改您的网络拓扑。
最后,您是否尝试过更改隐藏节点的数量?尽管我相信前两个选项更适合提高性能,但您可以尝试一下。(作为参考,我不记得修改激活函数的形状比选项 1 和 2 更能改善网络响应的实例。)
以下是关于隐藏层/节点配置的一些很好的讨论: 多层感知器 (MLP) 架构:选择隐藏层数量和隐藏层大小的标准? 如何选择神经网络中的隐藏层数和节点数?
24 个输入使您的问题成为高维问题。确保您的训练数据集充分覆盖输入状态空间,并确保您是您的测试数据,并且训练数据来自具有相似代表性的总体。(看看训练神经网络时的“交叉验证”讨论)。
香草 sigmoid 函数是:
def sigmoid(x):
return 1/(1+math.e**-x)
您可以将其转换为:
def mySigmoid(x):
return 2.5/(1+math.e**-x)
为了进行您想要的转换