2012-01-09 165 views
3

这里是我的代码(在MLP网络中的神经元):神经网络的激活/输出

double summation = 0; 
for (int i = 0; i < weights.length; i++) { 
    summation += inputs[i] * weights[i]; 
} 

double normalized = Math.tanh(summation); 
if (normalized > 0.9 || normalized < -0.9) { 
    activated = 1; 
} else { 
    activated = 0; 
} 

我认为这是不正确。输出应该是归一化的值,还是总是限制为0或1?

+1

这取决于..... – 2012-01-09 00:56:41

+0

你能详细点吗? – 2012-01-09 00:57:54

+0

不同型号使用不同的激活功能。 – 2012-01-09 01:01:09

回答

1

可能可以通过输出的迹象,但通常情况下,一个神经元的输出要求是连续可微,所以-1到1之间(一个真正的价值,因为你所选择的正切函数)会更合适,特别是如果您要使用反向传播来训练模型。

+0

所以我会说:activated = Math.tanh(summation); ? – 2012-01-09 01:02:49

+0

这是获得-1和1之间连续的,可微分输出的一种方法。 – 2012-01-09 01:03:40

+0

是的,但这样做是正确的吗?我不认为将0或1分配给输出将非常有效。 – 2012-01-09 01:04:41

2

常见的激活函数是Sigmoid。这很好,因为它可以压缩两个边界之间的神经元值。所以,总结了所有的值,然后应用您激活功能

这里是我的代码我的双曲线函数的摘录:

/** 
* シグモイド関数: Sigmoid function 
*/ 
private double sigmoid(double x) { 
    return (1.0/(1 + Math.exp(-x))); 
} 

还检查了神经网络的我Github上的例子(代码中的Java,C++也可用版本) https://github.com/kennycason/neuralnetwork/ https://github.com/kennycason/ml

0

有一个神经元没有“正确的”激活功能。你想要的是一个函数,它夹在两个值之间,并单调递增。双曲正切函数(您的“标准化”函数)可以很好地完成此任务,输出不会从-1运行到1,因为输入会从-inf运行到+ inf。

虽然有一些常见的激活功能。一个符号函数(如果输入小于零,则输出负值,否则输出一)也是有效的。另一个是Kenny Cason提到的逻辑曲线,但请注意,实际上可以将Kenny函数中的-x替换为-kx,其中k是某个常数。通过这种方式,您可以生成一系列S形曲线,并在零点附近有一个更紧密或更松散的过渡区域。

没有一个比另一个更“正确”。 (除非你正在做反向传播,在这种情况下,signum函数是不可区分的,并且不适用于你。)

但是,那就是说,我不明白你的“if”语句在做什么。看起来您正在创建一个函数,从一个下移到零,并在输入从-inf移动到+ inf时备份到一个函数。这不是你想要的。 (如果你从负数到零到正数,那就没问题了。)