Ограничение размера входного слоя Encog

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

 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...");
    }

}

person Du_    schedule 06.12.2014    source источник


Ответы (1)


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

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

Я только что добавил сообщение об ошибке 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) ...

person JeffHeaton    schedule 08.12.2014
comment
Даже это было полезно, у меня все еще есть проблема. Я удостоверяюсь, что ни одно входное изображение не меньше целевого размера понижения разрешения. - person Du_; 12.12.2014
comment
Я обновил вопрос, включив в него свой код. Похоже, EncogUtility.simpleFeedForward — это функция, которая выдает ошибку. - person Du_; 12.12.2014
comment
Просто чтобы уточнить, что сеть имеет как 30000 входных нейронов, так и только 1 выходной нейрон. - person Du_; 12.12.2014