2014-03-06 53 views
1

我使用前馈,反传,多层神经网络,我使用双曲线函数作为由具有-1到1范围内,但最小误差不会低于5.8激活功能而且我希望少一点,你可以在100000次迭代后看到输出结果。 graph of error against iterations in NN如何决定激活功能的神经网络

我想这是因为我的输出范围为大于1,和乙状结肠功能范围只有-1到1。有人建议我为我所需的输出范围是0到2.5,我可以如何克服这个问题。建议我哪个激活函数最适合这个范围。

回答

2

改造如果您正在寻求减少产量错误,有几件事情在之前调整节点的激活功能。

首先,你有一个偏置节点?偏置节点有几个含义,但是 - 与这个讨论最相关 - 它们允许网络输出转换到所需的输出范围。作为this reference状态:

The use of biases in a neural network increases the capacity of the network to solve problems by allowing the hyperplanes that separate individual classes to be offset for superior positioning.

这篇文章提供了一个很好的讨论: Role of Bias in Neural Networks。 这一个也不错:Why the BIAS is necessary in ANN? Should we have separate BIAS for each layer?

第二种方法:它通常有助于规范化您的输入和输出。当你注意,你的乙状结肠提供一系列的+/- 1.努力学习有一定范围的0功能,1000的时候(例如)这个小范围内可能会有问题。为了帮助学习,通常会缩放和翻译输入以适应节点激活功能。在这个例子中,可以将范围除以500,产生0到2的范围,然后从这个范围减去1。以这种方式,输入已被归一化到-1到1的范围,这更好地适合激活功能。需要注意的是网络输出应该规格化:第一,500

添加+1到输出,然后乘以你的情况,你可能会考虑0.8缩放输入,然后从结果中减去1。然后,您将网络输出添加1,然后乘以1.25以恢复所需的范围。请注意,此方法可能最容易完成,因为它不会像增加偏差那样直接更改网络拓扑。

最后,有你有改变隐藏节点的数量实验?虽然我相信前两个选项是提高性能的更好选择,但您可以试试这个。 (就像一个参考点,我不记得修改激活函数形状的实例比选项1和2提高了网络响应。)

下面是关于隐藏层/节点配置的一些很好的讨论: multi-layer perceptron (MLP) architecture: criteria for choosing number of hidden layers and size of the hidden layer? How to choose number of hidden layers and nodes in neural network?

24输入使您的问题高维之一。确保您的训练数据集充分覆盖输入状态空间,并确保您是测试数据,并且训练数据来自具有类似代表性的人群。(在训练神经网络时,请看“交叉验证”讨论)。

+0

实际上是我想要的输出范围为0〜5000,我试图将这个范围由5000并获得结果后我再乘以5000,这里错误得到纠正。但是,我仍然会尝试按照你的建议进行,因为在测试NN时,我只是在给定的输入组合中获得正确的输出,而对于其他输入则没有给出正确的输出。在这里,我使用了一个偏置节点,因为我的输入数字是24(节点:24 + 1),而在隐藏层中,我使用的是一般规则,即(#inputs + #outputs)*(2/3)。 – lkkkk

+0

请建议是否有任何规则初始设置随机权重,我有输入数量:24(二进制0和1)+ 1偏差,隐藏节点:18,输出:1(范围:0到5000)。什么应该是错误的确切曲线。 – lkkkk

+0

使用随机初始权重。看看这个链接:http://stackoverflow.com/questions/20027598/why-should-weights-of-neural-networks-be-initialized-to-random-numbers – Throwback1986

2

香草双曲线函数是:

def sigmoid(x): 
    return 1/(1+math.e**-x) 

你可以变换到:

def mySigmoid(x): 
    return 2.5/(1+math.e**-x) 

为了让你想

+0

我尝试了你的建议选项,但它给错误:OverflowError:(34,'数字结果超出范围') – lkkkk

+0

是这种方式,我可以设置所需的值在-1到1之间除以一些数字和在得到结果后,我可以再次使用sigmoid函数将该结果再乘以相同的数字。 – lkkkk

+0

@Latik:您可能无法对[-1,1]输出应用线性变换,因为这会从激活函数的“乙状结构”中消失。请在try/catch中将调用包装为'mySigmoid',并在异常时打印'x'的值。我不知道x'的'什么价值是导致此错误 – inspectorG4dget