2014-12-06 3 views
1

Я использую среду Encog с Java для создания системы распознавания образов. Тем не менее, когда я установить ширину и высоту Downsample выше 100, я получаюОграничение размера входного слоя Encog

java.lang.NegativeArraySizeException 

при попытке создать сеть.

Есть ли предел числа нейронов во входном слое?

public class PlateNetwork { 

    protected final List<RawImage> imageList; 
    protected ImageMLDataSet imageMLDataSet; 
    protected Downsample downsample; 
    protected Size downsampleSize; 
    protected int outputLayerSize; 
    protected BasicNetwork network; 

    public PlateNetwork() { 
     imageList = new ArrayList<>(); 
     outputLayerSize = Neuron.getTotalNeurons(); 
     downsample = new SimpleIntensityDownsample(); 
     downsampleSize = new Size(200, 150); 
     imageMLDataSet = new ImageMLDataSet(downsample, false, 1, -1); 
    } 

    public void processNN() { 
     inputImages(); 
     createNetwork(); 
     initTraining(); 
    } 

    private void inputImages() { 
     RawImage rawImage; 
     File[] inputImages = Global.inputFolder.listFiles(); 
     int inputLength = inputImages.length; 

     for (int i = 0; i < inputLength; i++) { 
      rawImage = new RawImage(inputImages[i], Neuron.BOL_PLATE); 
      imageList.add(rawImage); 
      imageMLDataSet.add(rawImage.getImageMLData(), rawImage.getIdeal()); 
     } 
    } 


    private void createNetwork() { 
     final int inputLayerSize = downsampleSize.getArea(); 
     final int hiddenLayerSize = (inputLayerSize + outputLayerSize) * 2/3; 
     final int hiddenLayer1Neurons = hiddenLayerSize; 
     final int hiddenLayer2Neurons = hiddenLayerSize; 

     imageMLDataSet.downsample(downsampleSize.getHeight(), downsampleSize.getWidth()); 
     network = EncogUtility.simpleFeedForward(imageMLDataSet.getInputSize(), 
                hiddenLayer1Neurons, 
                hiddenLayer2Neurons, 
                imageMLDataSet.getIdealSize(), 
                true); 
    } 

    private void initTraining() { 
     final int trainingMinutes = 1; 
     final double strategyError = 0.25; 
     final int strategyCycles = 50; 

     final ResilientPropagation train = new ResilientPropagation(network, imageMLDataSet); 
     train.addStrategy(new ResetStrategy(strategyError, strategyCycles)); 

     EncogUtility.trainConsole(train, network, imageMLDataSet, trainingMinutes); 
     System.out.println("Training Stopped..."); 
    } 

} 

ответ

1

Там нет ограничений на сколько нейронов вы можете разместить во входном слое нейронной сети с Encog, пока вы бежите из памяти.

Вышеприведенная ошибка обычно возникает, когда вы запрашиваете «downsampler» для уменьшения размера изображения до размера, большего, чем исходное изображение. Наверное, это будет «примерный». Я считаю, что вы попали в эту ошибку, потому что ваше наименьшее изображение меньше 100 пикселей. Downsampler в настоящее время позволяет только изображения больше, чем вы хотите уменьшить.

Я просто добавил сообщение об ошибке Encog для того, следующая версия Encog выбросит:

org.encog.EncogError: Невозможно повышающую дискретизацию. Вы не можете декодируют с 10x10 до 200x200 в org.encog.util.downsample.RGBDownsample.validate (RGBDownsample.java:403) в org.encog.util.downsample.SimpleIntensityDownsample.downSample (SimpleIntensityDownsample.java:55) ...

+0

Даже это было полезно. У меня все еще есть проблема. Я уверен, что входное изображение не будет меньше размера целевого объекта. –

+0

Я обновил вопрос, чтобы включить мой код, кажется, что EncogUtility.simpleFeedForward - это функция, которая выдает ошибку. –

+0

Просто для выяснения, что сеть имеет 30000 входных нейронов, но только 1 выход нейрона –