2016-04-20 34 views
0

我的網絡:33 * 61(2013)輸入節點。 2000隱藏層中的節點。 45(用於45個字符)輸出節點。Encog計算/分類錯誤的訓練數據

BasicNetwork basicNetwork = EncogUtility.simpleFeedForward(trainSet.getInputSize(), 2000, 0, trainSet.getIdealSize(), false); 

建設培訓設置的代碼(這是一個循環中運行):

NormalizedField c = new NormalizedField(NormalizationAction.Normalize,"color", 255,0,1,0); 
     BufferedImage image = ImageIO.read(file); 
     BasicMLData data = new BasicMLData(width*height); 
     for(int i = 0;i<width;i++){ 
      for(int j = 0;j<height;j++){ 
       Color color = new Color(image.getRGB(i,j)); 
       double value = c.normalize(color.getBlue()); 
       data.add(i*height+j,value); 
      } 
     } 
     final MLData ideal = new BasicMLData(charList.length()); 
     for (int i = 0; i < charList.length(); i++) { 
      if (i == charList.indexOf(e)) { 
       ideal.setData(i, 1); 
      } else { 
       ideal.setData(i, 0); 
      } 
     } 

     training.add(data,ideal); 

培訓代碼:

int i = 0; 
final ResilientPropagation rp = new ResilientPropagation(network,trainSet); 
     do { 
      rp.iteration(); 
      i++; 
      System.out.println("Error rate: " + rp.getError()); 
      if(i > 10){ 
       i = 0; 
       EncogDirectoryPersistence.saveObject(new File("myneural.eg"),network); 
      } 
     } while (rp.getError() >= 0.01) ; 

我已經訓練了45個字符用300張照片的每一個字符(圖像是單色的,因此r/b/g值是相同的),誤差率是〜0.02。 但是當訓練完成時,即使訓練數據也不能計算/分類。 我的測試代碼:

BufferedImage image = ImageIO.read(file); 
int width = image.getWidth(); 
int height = image.getHeight(); 
System.out.println("Width: " + width + " Height: " + height); 
BasicMLData data = new BasicMLData(width*height); 
NormalizedField c = new NormalizedField(NormalizationAction.Normalize,"color", 255,0,1,0); 
for(int i = 0;i<width;i++){ 
    for(int j = 0;j<height;j++){ 
     Color color = new Color(image.getRGB(i,j)); 
     double value = c.normalize(color.getBlue()); 
     data.add(i*height+j,value); 
    } 
} 
MLData compute = basicNetwork.compute(data); 

但是,當我嘗試分類,右邊焦炭仍然有非常低的值。我已經測試了不同的字符(在訓練集中),但是Encog總是將錯誤的字符分類。

data.add(i*height+j,value); 

與此:

回答

0

也許你應該以替換該行開始

data.add(i+ (j*width),value); 
+0

,但我認爲這是一樣的嗎? – Snoob