2017-09-21 41 views
0

我忙於在三個輸入,一個隱藏層與兩個隱藏的神經元和一個輸出神經元在java中的基本神經網絡。我以前做了一個較小的三個輸入和一個輸出,但沒有隱藏層,我用了一些使用公式(預測目標)^ 2計算反向傳播的基本微積分和成本。這兩個NN都不使用像sigmoid這樣的激活函數,因爲它們預測的是一個值,而不是二進制輸出。如何訓練神經網絡中的輸入 - 隱藏權重?

我的問題來了,當我試圖訓練我的更大的神經網絡與隱藏層。我第一次使用的基本微積分方法不起作用。

任何人都可以告訴我如何用隱藏層訓練神經網絡來幫助我嗎? (數學公式)

回答

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。