1

我已經在Java中編寫了一個簡單的人工神經網絡作爲項目的一部分。當我開始訓練數據時(使用我收集的訓練集)每個時期的錯誤計數快速穩定(達到約30%的準確性),然後停止。在測試ANN時,對於任何給定輸入的所有輸出都完全相同。神經網絡爲每個輸入返回相同的輸出

我試圖輸出0和1之間的數字(0到股票歸類爲輸家和1至立管分類 - 0.4-0.6應註明穩定性)

當在同一訓練數據爲RapidMiner工作室創建了一個合適的人工神經網絡,精度更高(70 +%),因此我知道數據集很好。 ANN邏輯中必定存在一些問題。

下面是運行和調整權重的代碼。任何和所有幫助表示讚賞!

public double[] Run(double[] inputs) { 
    //INPUTS 
    for (int i = 0; i < inputNeurons.length; i++) { 
     inputNeurons[i] = inputs[i]; 
    } 

    for (int i = 0; i < hiddenNeurons.length; i++) { 
     hiddenNeurons[i] = 0; 
    } //RESET THE HIDDEN NEURONS 

    for (int e = 0; e < inputNeurons.length; e++) { 
     for (int i = 0; i < hiddenNeurons.length; i++) { 
      //Looping through each input neuron connected to each hidden neuron 

      hiddenNeurons[i] += inputNeurons[e] * inputWeights[(e * hiddenNeurons.length) + i]; 
      //Summation (with the adding of neurons) - Done by taking the sum of each (input * connection weight) 
      //The more weighting a neuron has the more "important" it is in decision making 
     } 
    } 

    for (int j = 0; j < hiddenNeurons.length; j++) { 
     hiddenNeurons[j] = 1/(1 + Math.exp(-hiddenNeurons[j])); 
     //sigmoid function transforms the output into a real number between 0 and 1 
    } 

    //HIDDEN 
    for (int i = 0; i < outputNeurons.length; i++) { 
     outputNeurons[i] = 0; 
    } //RESET THE OUTPUT NEURONS 

    for (int e = 0; e < hiddenNeurons.length; e++) { 
     for (int i = 0; i < outputNeurons.length; i++) { 
      //Looping through each hidden neuron connected to each output neuron 

      outputNeurons[i] += hiddenNeurons[e] * hiddenWeights[(e * outputNeurons.length) + i]; 
      //Summation (with the adding of neurons) as above 
     } 
    } 

    for (int j = 0; j < outputNeurons.length; j++) { 
     outputNeurons[j] = 1/(1 + Math.exp(-outputNeurons[j])); //sigmoid function as above 
    } 

    double[] outputs = new double[outputNeurons.length]; 
    for (int j = 0; j < outputNeurons.length; j++) { 
     //Places all output neuron values into an array 
     outputs[j] = outputNeurons[j]; 
    } 
    return outputs; 
} 

public double[] CalculateErrors(double[] targetValues) { 
    //Compares the given values to the actual values 
    for (int k = 0; k < outputErrors.length; k++) { 
     outputErrors[k] = targetValues[k] - outputNeurons[k]; 
    } 
    return outputErrors; 
} 

    public void tuneWeights() //Back Propagation 
{ 
    // Start from the end - From output to hidden 
    for (int p = 0; p < this.hiddenNeurons.length; p++)  //For all Hidden Neurons 
    { 
     for (int q = 0; q < this.outputNeurons.length; q++) //For all Output Neurons 
     { 
      double delta = this.outputNeurons[q] * (1 - this.outputNeurons[q]) * this.outputErrors[q]; 
      //DELTA is the error for the output neuron q 
      this.hiddenWeights[(p * outputNeurons.length) + q] += this.learningRate * delta * this.hiddenNeurons[p]; 
      /*Adjust the particular weight relative to the error 
      *If the error is large, the weighting will be decreased 
      *If the error is small, the weighting will be increased 
      */ 
     } 
    } 

    // From hidden to inps -- Same as above 
    for (int i = 0; i < this.inputNeurons.length; i++)  //For all Input Neurons 
    { 
     for (int j = 0; j < this.hiddenNeurons.length; j++) //For all Hidden Neurons 
     { 
      double delta = this.hiddenNeurons[j] * (1 - this.hiddenNeurons[j]); 
      double x = 0;  //We do not have output errors here so we must use extra data from Output Neurons 
      for (int k = 0; k < this.outputNeurons.length; k++) { 
       double outputDelta = this.outputNeurons[k] * (1 - this.outputNeurons[k]) * this.outputErrors[k]; 
       //We calculate the output delta again 
       x = x + outputDelta * this.hiddenWeights[(j * outputNeurons.length) + k]; 
       //We then calculate the error based on the hidden weights (x is used to add the error values of all weights) 
       delta = delta * x; 
      } 
      this.inputWeights[(i * hiddenNeurons.length) + j] += this.learningRate * delta * this.inputNeurons[i]; 
      //Adjust weight like above 
     } 
    } 
} 
+1

你如何初始化的權重?開始時他們不都是0嗎? –

+0

嘗試使用相同的結果,目前他們正在-1和1之間進行隨機初始化。 –

+0

如果您使用0初始化它們,您可能會得到這樣的效果(即您的網絡只會停留在此配置中)。它現在工作嗎(隨機初始化後)? –

回答

1

長coversation後,我認爲你可以找到一個回答你的問題有以下幾點:

  1. 偏差是非常重要的。其實 - 關於神經網絡最流行的SO問題之一是關於偏見:): Role of Bias in Neural Networks
  2. 你應該照顧你的學習過程。跟蹤測試的準確性和驗證集並在訓練期間使用適當的學習率是很好的。我建議你使用簡單的數據集,當你知道很容易找到真正的解決方案(例如 - 一個三角形或正方形 - 然後使用4-5個隱藏單位)。我也建議你使用以下playgroud:

http://playground.tensorflow.org/#activation=tanh&batchSize=10&dataset=circle&regDataset=reg-plane&learningRate=0.03&regularizationRate=0&noise=0&networkShape=4,2&seed=0.36368&showTestData=false&discretize=false&percTrainData=50&x=true&y=true&xTimesY=false&xSquared=false&ySquared=false&cosX=false&sinX=false&cosY=false&sinY=false&collectStats=false&problem=classification