2014-12-06 53 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