java - XOR Java 神经网络

标签 java neural-network xor

尝试在 java 中使用 XOR 神经网络,但网络总是预测它训练的最终输出。

这是我的代码

for( int i = 0; i < 4; i++ ) { //Forward pass
        diff = 1;
        while( diff > 0.01 ) {
        SumError = 0;
        Y1 = ( InputOne[i] * Weight[0] ) + ( InputTwo[i] * Weight[1] ) + Weight[6];
        Y1 = 1 / ( 1 + Math.exp( -Y1 ) );
        Node1[i] = Y1;

        Y2 = ( InputOne[i] * Weight[2] ) + ( InputTwo[i] * Weight[3] ) + Weight[7];
        Y2 = 1 / ( 1 + Math.exp( -Y2 ) );
        Node2[i] = Y2;

        Y3 = ( Y1 * Weight[4] ) + ( Y2 * Weight[5] ) + Weight[8];
        Y3 = 1 / ( 1 + Math.exp( -Y3 ) );
        Node3[i] = Y3;

        diff = Math.abs( Result[i] - Y3 );

        System.out.println( i + " " + Result[i] + " " + Y3 + " " + diff );

        //Error Signals
        Delta3[i] = Y3 * ( 1 - Y3 ) * ( Result[i] - Y3 );
        Delta2[i] = Node2[i] * ( 1 - Node2[i] ) * ( Delta3[i] * Weight[5] );
        Delta1[i] = Node1[i] * ( 1 - Node1[i] ) * ( Delta3[i] * Weight[4] );

        //Update Weights
        Weight[0] = Weight[0] + ( ( WeightChange[0] * alpha ) + ( eta * Delta2[i] * InputOne[i] ) );
        Weight[2] = Weight[2] + ( ( WeightChange[2] * alpha ) + ( eta * Delta2[i] * InputTwo[i] ) );

        Weight[1] = Weight[1] + ( ( WeightChange[1] * alpha ) + ( eta * Delta1[i] * InputOne[i] ) );
        Weight[3] = Weight[3] + ( ( WeightChange[3] * alpha ) + ( eta * Delta1[i] * InputTwo[i] ) );

        Weight[4] = Weight[4] + ( ( WeightChange[4] * alpha ) + ( eta * Delta3[i] * Y1 ) );
        Weight[5] = Weight[5] + ( ( WeightChange[5] * alpha ) + ( eta * Delta3[i] * Y2 ) );

        Weight[6] = Weight[6] + ( ( WeightChange[6] * alpha ) + ( eta * Delta1[i] ) );
        Weight[7] = Weight[7] + ( ( WeightChange[7] * alpha ) + ( eta * Delta2[i] ) );
        Weight[8] = Weight[8] + ( ( WeightChange[8] * alpha ) + ( eta * Delta3[i] ) );

        for( int k = 0; k < 9; k++ ) {
            WeightChange[k] = OldWeight[k] - Weight[k];
            OldWeight[k] = Weight[k];
        }

        //Global Error
    for( int j = 0; j < 4; j++ ) {
        Y1 = ( InputOne[j] * Weight[0] ) + ( InputTwo[j] * Weight[1] ) + Weight[6];
        Y1 = 1 / ( 1 + Math.exp( -Y1 ) );

        Y2 = ( InputOne[j] * Weight[2] ) + ( InputTwo[j] * Weight[3] ) + Weight[7];
        Y2 = 1 / ( 1 + Math.exp( -Y2 ) );

        Y3 = ( Y1 * Weight[4] ) + ( Y2 * Weight[5] ) + Weight[8];
        Y3 = 1 / ( 1 + Math.exp( -Y3 ) );

        //System.out.println( Y3 + " " + Math.abs( Result[j] - Y3 ) );

        SumError = SumError + Math.pow( ( Result[j] - Y3 ) , 2 );
    }
        SumError = SumError * 0.5;
    }
    Count = Count + 1;  
        }

其中InputOneInputTwoResult为异或真值表项,权重随机分配,WeightChange 是动量。

然后我再次输入真值表,每个输出或多或少与它训练的最后一个输入相同。

有没有人有什么想法?

最佳答案

你应该针对 case1(once)、case2(once)、case3(once)、case4(once) 进行训练 --> 再次重复,直到它学会所有四个。没有一个案例。每个案例进行一次迭代。你需要让它学习塑料。对于您的教学方案,当您教case2时,它会忘记case1。您需要在一个通用的 while 循环中重复输入所有情况,直到总错误减少到下限。

当您让它只学习单个案例时,它会学得很好但会忘记其他案例。因此,您一个接一个地输入数据,并使一组案例的总误差(可能是误差平方和)小于公差。

关于java - XOR Java 神经网络,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22745155/

相关文章:

neural-network - 深度神经网络真的需要全连接层吗?

python - 如何从文件中读取两位数字,将其与 (0x91) 异或并打印到屏幕?

java - 复制构造函数是否需要复制互斥体?

java - 将 SELECT COUNT(*) 查询结果分配给 Java 变量

python - 如何使用 bert 嵌入而不是 glove/fasttext 等静态嵌入来训练神经网络模型?

c++ - Caffe C++ 在输入层设置数据

c++ - 异或数据包中的所有数据

java - 选择排序中的交换

java - InetAddress.getLocalHost().getHostName() 抛出 UnknownHostException

java - 从属性文件java设置静态变量