【问题标题】:Encog input layer size limitEncog输入层大小限制
【发布时间】:2015-02-04 21:34:48
【问题描述】:

我正在使用 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...");
    }

}

【问题讨论】:

    标签: java machine-learning image-recognition encog


    【解决方案1】:

    在 Encog 神经网络的输入层中可以放置多少个神经元没有限制,直到内存用完为止。

    当您要求“下采样器”将图像下采样到大于源图像的尺寸时,通常会发生上述错误。我猜这将是一个“上采样”。我相信您遇到了该错误,因为您的最小图像小于 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) ...

    【讨论】:

    • 即使它很有用,我仍然有问题。我确保没有输入图像小于下采样目标大小。
    • 我已更新问题以包含我的代码,似乎 EncogUtility.simpleFeedForward 是引发错误的函数。
    • 只是为了澄清网络有 30000 个输入神经元,但只有 1 个输出神经元
    猜你喜欢
    • 1970-01-01
    • 2011-08-31
    • 2012-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多