Java中的XOR神经网络

Java中的XOR神经网络,java,neural-network,xor,Java,Neural Network,Xor,我尝试在Java中实现并训练一个带反向传播的五神经元神经网络,用于XOR函数。我的代码(请原谅它的丑陋): 公共类XORBackProp{ 私有静态最终int MAX_EPOCHS=500; //砝码 专用静态双w13、w23、w14、w24、w35、w45; 专用静态双θ3、θ4、θ5; //神经元输出 专用静态双gamma3、gamma4、gamma5; //神经元误差梯度 专用静态双delta3、delta4、delta5; //重量校正 专用静态双dw13、dw14、dw23、dw24、

我尝试在Java中实现并训练一个带反向传播的五神经元神经网络,用于XOR函数。我的代码(请原谅它的丑陋):

公共类XORBackProp{
私有静态最终int MAX_EPOCHS=500;
//砝码
专用静态双w13、w23、w14、w24、w35、w45;
专用静态双θ3、θ4、θ5;
//神经元输出
专用静态双gamma3、gamma4、gamma5;
//神经元误差梯度
专用静态双delta3、delta4、delta5;
//重量校正
专用静态双dw13、dw14、dw23、dw24、dw35、dw45、dt3、dt4、dt5;
//学习率
专用静态双α=0.1;
私有静态双重错误;
专用静态双采集器;
私有静态int-epoch=0;
私有静态布尔循环=true;
专用静态双S形(双指数)
{
收益率(1.0/(1+Math.pow(Math.E,(-1)*指数));
}
专用静态无效激活剂尿隆(int x1、int x2、int gd5)
{
gamma3=乙状结肠(x1*w13+x2*w23-θ3);
gamma4=乙状结肠(x1*w14+x2*w24-θ4);
gamma5=乙状结肠(gamma3*w35+gamma4*w45-θ);
错误=gd5-gamma5;
举重训练(x1,x2);
}
私人静态训练(int x1,int x2)
{
delta5=gamma5*(1-gamma5)*错误;
dw35=α*gamma3*delta5;
dw45=α*gamma4*delta5;
dt5=α*(-1)*δ5;
delta3=gamma3*(1-gamma3)*delta5*w35;
delta4=gamma4*(1-gamma4)*delta5*w45;
dw13=α*x1*delta3;
dw23=α*x2*delta3;
dt3=α*(-1)*三角洲3;
dw14=α*x1*delta4;
dw24=α*x2*delta4;
dt4=α*(-1)*δ4;
w13=w13+dw13;
w14=w14+dw14;
w23=w23+dw23;
w24=w24+dw24;
w35=w35+dw35;
w45=w45+dw45;
θ3=θ3+dt3;
θ4=θ4+dt4;
θ5=θ5+dt5;
}
公共静态void main(字符串[]args)
{
w13=0.5;
w14=0.9;
w23=0.4;
w24=1.0;
w35=-1.2;
w45=1.1;
θ3=0.8;
θ4=-0.1;
θ=0.3;
System.out.println(“XOR神经网络”);
while(循环)
{
激活剂脲(1,1,0);
sumSqrError=错误*错误;
激活剂脲(0,1,1);
sumSqrError+=错误*错误;
激活剂脲(1,0,1);
sumSqrError+=错误*错误;
激活剂脲(0,0,0);
sumSqrError+=错误*错误;
时代++;
if(历元>=最大历元)
{
System.out.println(“学习将花费超过”+MAX_EPOCHS+“EPOCHS,因此程序已终止”);
系统出口(0);
}
System.out.println(epochs+“”+sumSqrError);
如果(sumSqrError<0.001)
{
循环=假;
}
}
}
}
如果有帮助的话,这里有一个例子


所有权重和学习率的初始值直接取自教科书中的一个示例。目标是训练网络,直到平方误差之和小于0.001。教科书还提供了第一次迭代(1,1,0)后所有权重的值,我已经测试了我的代码,其结果与教科书的结果完全匹配。但根据这本书,这只需要224个时代就可以实现融合。但当我运行它时,它总是达到MAX_纪元,除非它设置为几千。我做错了什么?

在Instance的激活阶段尝试对gamma3、gamma4、gamma5进行取整:

if (gamma3 > 0.7) gamma3 = 1;
if (gamma3 < 0.3) gamma3 = 0;
学习在466个时代结束

当然,如果u进行更大的舍入和更高的alpha u set,则u可以获得比224更好的结果。

//将此添加到常量声明部分。
    //Add this in the constants declaration section.
    private static double alpha = 3.8, g34 = 0.13, g5 = 0.21;

    // Add this in activate neuron
    gamma3 = sigmoid(x1 * w13 + x2 * w23 - theta3);
    gamma4 = sigmoid(x1 * w14 + x2 * w24 - theta4);        
    if (gamma3 > 1 - g34 ) {gamma3 = 1;}
    if (gamma3 < g34) {gamma3 = 0;}
    if (gamma4 > 1- g34) {gamma4 = 1;}
    if (gamma4 < g34) {gamma4 = 0;}   
    gamma5 = sigmoid(gamma3 * w35 + gamma4 * w45 - theta5);
    if (gamma5 > 1 - g5) {gamma5 = 1;}
    if (gamma5 < g5) {gamma5 = 0;}
私人静态双阿尔法=3.8,g34=0.13,g5=0.21; //把这个加到激活神经元里 gamma3=乙状结肠(x1*w13+x2*w23-θ3); gamma4=乙状结肠(x1*w14+x2*w24-θ4); 如果(gamma3>1-g34){gamma3=1;} 如果(gamma31-g34){gamma4=1;} 如果(gamma41-g5){gamma5=1;} 如果(gamma5

ANN应该在66次迭代中学习,但正处于发散的边缘。

这个网络的整个要点是展示如何处理这样一种情况:分组不是基于“top=yes,bottom=no”,而是有一条中心线(在这种情况下通过点(0,1)和(1,0)),如果值接近该线,则答案是“yes”,若距离很远,那个么答案是“不”。这样的系统不能只使用一层进行集群。然而,两层就足够了

在您的图表中,
w14
箭头被错误地标记为
w24
。我将学习率更改为19.801(通常过高),并在300个时代内达到了所需的错误。我认为他们采取了另一种学习速度。但是代码中也可能有错误。
alpha = 0.2;
    //Add this in the constants declaration section.
    private static double alpha = 3.8, g34 = 0.13, g5 = 0.21;

    // Add this in activate neuron
    gamma3 = sigmoid(x1 * w13 + x2 * w23 - theta3);
    gamma4 = sigmoid(x1 * w14 + x2 * w24 - theta4);        
    if (gamma3 > 1 - g34 ) {gamma3 = 1;}
    if (gamma3 < g34) {gamma3 = 0;}
    if (gamma4 > 1- g34) {gamma4 = 1;}
    if (gamma4 < g34) {gamma4 = 0;}   
    gamma5 = sigmoid(gamma3 * w35 + gamma4 * w45 - theta5);
    if (gamma5 > 1 - g5) {gamma5 = 1;}
    if (gamma5 < g5) {gamma5 = 0;}