2014-12-06 50 views
1

我使用Encog框架與Java來執行圖像識別系統。儘管如此,當我將降採樣寬度和高度設置爲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神經網絡的輸入層中可以放置多少個神經元,沒有限制,直到內存用完。

當您要求「下采樣器」將圖像下采樣到比源圖像更大的尺寸時,通常會出現上述錯誤。這將是一個「upsample」我猜。我相信你會遇到這個錯誤,因爲你的最小圖像小於100像素。下采樣器目前只允許圖像大於您希望縮小採樣的圖像。

我只是添加了對一個Encog錯誤消息,Encog的下一個版本會拋出:

org.encog.EncogError:不能上取樣。您無法在org.encog.util.downsample.SimpleIntensityDownsample.downSample(SimpleIntensityDownsample.java:55) (org.encog.util.downsample.RGBDownsample.validate(RGBDownsample.java:403) )下取樣10x10至200x200 ...

+0

即使它一直有用我仍然有問題。我確保沒有輸入圖像小於下采樣目標大小。 – 2014-12-12 02:34:48

+0

我已經更新了包含我的代碼的問題,好像EncogUtility.simpleFeedForward是引發錯誤的函數。 – 2014-12-12 02:36:56

+0

只是爲了澄清網絡有30000輸入神經元,但只有1輸出神經元 – 2014-12-12 02:37:50