神经网络激活/输出

时间:2012-01-09 00:54:00

标签: java artificial-intelligence neural-network

这是我的代码(对于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?

3 个答案:

答案 0 :(得分:2)

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

以下是我的代码中我的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

答案 1 :(得分:1)

可以简单地使用输出的符号,但通常,神经元的输出需要是连续的和可微分的,所以-1和1之间的实数值(因为你&# 39; ve选择tanh函数)会更合适,特别是如果你要使用反向传播训练模型。

答案 2 :(得分:0)

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

但是,有许多常见的激活功能。一个signum函数(如果输入小于零,则输出负一,否则输出一个)也是有效的。另一个是Kenny Cason提到的逻辑曲线,但请注意,你实际上可以替换Kenny函数中的-x是-kx,其中k是常量。通过这种方式,您可以生成一系列S形曲线,其中过零区域更近或更宽松。

没有一个比另一个更“正确”。 (除非你正在进行反向传播,在这种情况下,signum函数是不可微分的,并且对你不起作用。)

然而,那说,我不明白你的“if”陈述在做什么。看起来你正在创建一个函数,当输入从-inf移动到+ inf时,它从一个转换为零,然后返回到一个函数。这根本不是你想要的。 (如果你从负一到零变为正一,那就没关系。)