2016-04-20 6 views
0

Моя сеть: 33 * 61 (2013) входной узел. 2000 в 1 скрытом слое. 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 всегда классифицирует неправильный символ.

ответ

0

Может быть, вы должны начать с замены этой строки:

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

с этим:

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

, но я думаю, что это то же самое? – Snoob