这是我的代码(对于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?
答案 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时,它从一个转换为零,然后返回到一个函数。这根本不是你想要的。 (如果你从负一到零变为正一,那就没关系。)