2013-11-10 163 views
2

我正在訓練一個神經網絡來分類圖像,並且完成一次迭代需要很長的時間...大約五分鐘,但仍然沒有完成。我正在使用Encog 3.1。我的代碼有問題嗎?Encog神經網絡訓練java太慢

BasicNetwork network = new BasicNetwork(); 
     network.addLayer(new BasicLayer(null,true,5625)); 
     network.addLayer(new BasicLayer(new ActivationSigmoid(),true,(intIdealCount+5625)/2)); 
     network.addLayer(new BasicLayer(new ActivationSigmoid(),true,intIdealCount)); 
     network.getStructure().finalizeStructure(); 

這裏是我的訓練代碼:

final ResilientPropagation train = new ResilientPropagation(network, trainingSet); 

     int epoch = 1; 

     do { 
      train.iteration(); 
      System.out.println("Epoch #" + epoch + " Error:" + train.getError()); 
      epoch++; 
     } while(train.getError() > 0.01); 

任何響應將不勝感激。謝謝。

+0

我不熟悉這個庫,但熟悉機器學習和它的應用成像。這可能需要很長時間... –

+0

嗨,對OT很抱歉,但我開始使用encog,並且我有一些我不完全理解的東西。我可以問你一點時間嗎?如果是的話,請檢查我的問題問題:http://stackoverflow.com/questions/21847695/c-sharp-encog-svm-classification-with-my-own-dataset。謝謝 – user2886091

回答

4

你的代碼看起來不錯,但是根據你的數據,培訓可以任意長。從你的網絡規模可以推斷出,你正在使用圖像 - 現在如果你有很多圖像 - 即使最有效的實現將永遠存在。 Encog是相當好的一段代碼 - 默認情況下它適用於所有可用的內核,但FANN似乎是目前最快的ANN庫。

你有〜5000個輸入神經元,假設你有〜10個輸出神經元,你有〜2500個隱藏的神經元。所以你的網絡有(5000 + 1)* 2500 +(2500 + 1)* 10的權重(約12,500,000)。現在,假設您的訓練集中有N幅圖像 - 一個時期需要計算(和更新)12,500,000 * N個值。所以即使你只有200張圖像,它也是25億次更新來計算的。

至少有三種可能的方式:

  • 嘗試FANN庫,這是最有效率的
  • 例如使用PCA(減少您的圖片維度之一,作爲一個結果 - 減少網絡的大小)
  • 您確定需要2500個隱藏節點嗎?這是相當多的
+0

你建議隱藏多少層?我正在通過圖像識別進行皮膚疾病診斷。 –

+0

我建議儘可能小。更大的數量不僅意味着更長的計算,而且更可能是過度擬合。簡單地從一些小的開始,並在必要時增加它的大小 - 而不是相反。 – lejlot

+0

我以前從未使用過Encog - 但那不是完整的圖片。雖然是一個很大的數字 - 那只有2.5 GigaFLOPs。一個(不花哨)的核心2 Q6600可以每秒38個GigaFLOPs。即使假設Java對原始吞吐量的懲罰比C/C++要慢 - 應該可以在合理的時間內完成1個時期。 –