Neural network 神经网络教学:双极异或
我试图教一个由2个输入、4个隐藏节点(都在同一层)和1个输出节点组成的神经网络。二进制表示很好,但我对双极表示有问题。我不知道为什么,但总误差有时会收敛到2.xx左右的相同数字。我的乙状结肠是2/(1+exp(-x))-1。也许我用乙状结肠在错误的地方。例如,要计算输出误差,我应该将sigmoided输出与预期值进行比较,还是与sigmoided预期值进行比较 我在这里关注这个网站:,但他们使用不同的功能,然后我被指示使用。即使当我尝试实现它们的功能时,我仍然遇到同样的问题。无论哪种方式,我都有一半的时间被困在同一个数字上(不同的实现有不同的数字)。请告诉我我的代码中是否有错误,或者这是否正常(我不知道这是怎么回事)。动量设置为0。这是一个常见的0动量问题吗?我们应该使用的错误函数是: 如果ui是一个输出单元Neural network 神经网络教学:双极异或,neural-network,xor,Neural Network,Xor,我试图教一个由2个输入、4个隐藏节点(都在同一层)和1个输出节点组成的神经网络。二进制表示很好,但我对双极表示有问题。我不知道为什么,但总误差有时会收敛到2.xx左右的相同数字。我的乙状结肠是2/(1+exp(-x))-1。也许我用乙状结肠在错误的地方。例如,要计算输出误差,我应该将sigmoided输出与预期值进行比较,还是与sigmoided预期值进行比较 我在这里关注这个网站:,但他们使用不同的功能,然后我被指示使用。即使当我尝试实现它们的功能时,我仍然遇到同样的问题。无论哪种方式,我都有
错误(i)=(Ci-ui)*f'(Si)
如果ui是一个隐藏单元
Error(i)=Error(Output)*weight(i到Output)*f'(Si)
公共双S形(双x){
双fBipolar、fBinary、temp;
温度=(1+数学表达式(-x));
fBipolar=(2/温度)-1;
fBinary=1/温度;
中频(双极){
返回fBipolar;
}否则{
返回FBI;
}
}
//将权重初始化为随机值。
私有无效初始化权(双负,双位){
对于(int i=0;ipos){
打印(“错误”);
打印(输入权重[i][j]);
}
}
}
对于(int i=0;ipos){
打印(“错误”);
打印(隐藏权重[i]);
}
}
}
//在不进行训练的情况下计算NN的输出。即向前传球
公共双输出(双向量){
for(int i=0;i
一般编码注释:
initializeWeights(-1.0, 1.0);
可能无法实际获得您期望的初始值
初始化灯光可能具有:
inputWeights[i][j] = Math.random() * (pos - neg) + neg;
// ...
hiddenWeights[i] = (Math.random() * (pos - neg)) + neg;
而不是:
Math.random() - pos;
因此,这是可行的:
initializeWeights(0.0, 1.0);
并为您提供介于0.0和1.0之间的初始值,而不是介于-1.0和0.0之间的初始值
lastDelta
在声明之前使用:
deltaHiddenWeights[i] = learningRate * outputError * hiddenActivation[i] + (momentum * lastDelta);
我不确定是否需要numinput+1
和numHiddenNeurons+1
上的+1
记住要注意整数的四舍五入:5/2=2,而不是2.5!
改用5.0/2.0。通常,当输出应为双精度时,在代码中添加.0
最重要的是,你训练神经网络的时间够长吗
试着用numInputs=2、numHiddenNeurons=4、learningRate=0.9和训练1000或10000次来运行它。
使用numHiddenNeurons=2时,它在试图解决XOR问题时有时会“卡住”
另见
deltaHiddenWeights[i] = learningRate * outputError * hiddenActivation[i] + (momentum * lastDelta);