2015-05-27 41 views
0

我正在使用FANN庫來構建神經網絡來執行迴歸問題。事情是,一旦網絡已經接受相關訓練集的訓練(似乎工作得很好),每一次測試都會輸出完全相同的結果。換句話說,根據我的16個預測變量的任何狀態,根據ANN的預測輸出是相同的。C++ FANN fann_run總是產生相同的輸出

我的猜測是網絡正確計算第一行計算,然後總是在其他計算上輸出這個結果,不管我餵它(因爲它似乎在第一個訓練示例中表現得非常好,給出準確的預測)。

例如,我的第一堂訓練例如變量是:

1 1 13.5 13.5 13.5 14.5 14.4 14.3 14.3 14.2 14.5 13 11.7 12.2 12.2 11.3 

我的目標輸出爲14.5,而在每個測試,網絡輸出14.69和14.7(之間的事情,由於小的計算時間,因爲我只玩包,我每次運行代碼時都會訓練它)。 因此,該輸出對於該組數據似乎完全合法。

事情是,當我嘗試在其他幾個輸入上運行它時,我總是得到相同的14.69/14.7(即使是最小的數字也是相同的輸出)。

由於網絡似乎正在正確處理訓練示例,在一個新的測試示例上正確學習關係並計算正確,我傾向於認爲所有訓練部分都是正確的。由於沒有理由網絡總是會輸出相同的值,我的猜測是我的測試方式不正確。

我的問題是:在新數據集上測試FANN神經網絡的確切語法是什麼?並且,如何打印/保存相應的輸出?

這裏是我的代碼的當前狀態:

fann_type *calc_out; 
fann_type input[16]; 

for (int i = 0; i < 20; i++) 
{ 
    if (!rowHasNA(timeSerie, i)) 
    { 
     cout << "Input : "; 
     for (int j = 1; j < 17; j++) 
     { 
      input[j - 1] = timeSerie(i, j); 
      cout << input[j - 1] << " "; 
     } 
     cout << endl; 
     calc_out = fann_run(ann, input); 
     cout << "Input " << i << " gives : " << calc_out[0] << endl; 
    } 
} 

其中:

  • rowHasNA是我用來確定我的例子是否具有自定義函數至少一個NA
  • ann是已經訓練過的fann*
  • timeSeriematrix<double>其中每行都是一個測試示例

我對FANN軟件包的工作原理還是有點困惑,因爲我沒有發現關於如何訓練網絡和測試它們的真正清晰的文檔。我很難理解fann_type是如何工作的。

預先感謝您。

+0

在訓練和運行之前簡單地縮放功能 –

回答

1

它可能關注的人。

上面寫的代碼是正確的:在網絡已經過適當培訓的情況下,它管理爲不同輸入輸出不同的值。

主要問題是培訓網絡。由於它給了我一個正確的答案(14.7,非常接近預期的14.5),我認爲它已經過適當的訓練。實際上,這並不是,而且是給予與訓練目標相對應的「最佳平均值」。由於我的訓練集具有非常小的差異性,無論輸入什麼輸入,總是輸出相同的值,這就是給出了一個體面的MSE(雖然比我在R和Octave中的差,但因爲我從未使用過FANN,不知道會發生什麼)。

該解決方案很簡單,我應該早點考慮一下:功能縮放。

由於我在互聯網上發表了一些文獻,我認爲該軟件包正在自行進行擴展功能。用最基本的代碼來訓練網絡,特徵縮放不適用於訓練集。

我推薦一個縮放比例在0到1之間的特徵(x - min/max - min)。

+0

確保初始化NN的權重和偏差不會產生相同的結果:) – pbu

相關問題