如何训练神经网络中的输入到隐藏权重?

时间:2017-09-21 11:36:02

标签: java neural-network artificial-intelligence

我正在忙着在java中创建一个基本的神经网络,有三个输入,一个隐藏层有两个隐藏神经元和一个输出神经元。我之前做过一个较小的一个有三个输入和一个输出但没有隐藏层,我用过使用公式(预测目标)^ 2计算用于反向传播的一些基本计算和成本。这两个NN都不使用像sigmoid这样的激活函数,因为它们预测的是值,而不是二进制输出。

当我尝试用隐藏层训练我更大的NN时,我的问题就出现了。我用于第一个的基本微积分方法不起作用。

有人可以通过告诉我如何使用隐藏层训练NN来帮助我吗? (数学公式)

1 个答案:

答案 0 :(得分:0)

YouTube上的

This video应该是一个很好的资源!如果您只对数学公式感兴趣,可以跳到第二部分的末尾。如果您想知道如何更新权重,我建议您观看这两个视频。使用此视频,我开发了以下算法:

public void applyBackpropagation(double expectedOutput[]){

    for (int i = 0; i < expectedOutput.length; i++) {
        double d = expectedOutput[i];
        if (d < 0 || d > 1) {
            if (d < 0)
                expectedOutput[i] = 0 + epsilon;
            else
                expectedOutput[i] = 1 - epsilon;
        }
    }

    int i = 0;
    for(Neuron n : outputLayer){
        ArrayList<Connection> connections = n.getAllInConnections();
        double Ok = n.getOutput();
        double tk = expectedOutput[i];
        double dk = Ok*(1-Ok)*(Ok - tk);
        for(Connection c : connections){
            double dw = -learningRate * dk * c.leftNeuron.getOutput();
            c.setWeight(c.getWeight() + dw);
        }
        i++;
    }

    for(Neuron n : hiddenLayer){
        ArrayList<Connection> connections = n.getAllInConnections();
        double Oj = n.getOutput();
        double sum = 0;
        i = 0;
        for(Neuron out_n : outputLayer){
            double out_ok = out_n.getOutput();
            double out_tk = expectedOutput[i];
            double out_dk = out_ok*(1-out_ok)*(out_ok - out_tk);
            double wjk = getWeightByNeurons(n, out_n);
            sum += out_dk * wjk;
            i++;
        }
        double dj = Oj*(1-Oj)*sum;

        for(Connection c : connections){
            double dw = -learningRate * dj * c.getFromNeuron().getOutput();
            c.setWeight(c.getWeight() + dw);
        }
    }
}

使用的激活函数是sigmoid。