Как настроить DL4j для локальных образов - PullRequest
0 голосов
/ 05 апреля 2020

Я пытаюсь использовать DeepLearning4j для классификации изображений 32x32 в числах от 0 до 9. Я просмотрел несколько примеров и учебных пособий, но всегда сталкивался с некоторыми исключениями при установке набора данных в сеть.

В настоящее время я пытаюсь использовать ImageRecordReader с ParentPathLabelGenerator и RecordReaderDataSetIterator.

Изображения, кажется, загружаются нормально, но я всегда сталкиваюсь с DL4JInvalidInputException при установке.

        File parentDir = new File(dataPath);
        FileSplit filesInDir = new FileSplit(parentDir, NativeImageLoader.ALLOWED_FORMATS);
        ParentPathLabelGenerator labelMaker = new ParentPathLabelGenerator();

        BalancedPathFilter pathFilter = new BalancedPathFilter(new Random(), labelMaker, 100);
        InputSplit[] filesInDirSplit = filesInDir.sample(pathFilter, 80, 20);
        InputSplit trainData = filesInDirSplit[0];
        InputSplit testData = filesInDirSplit[1];

        ImageRecordReader recordReader = new ImageRecordReader(numRows, numColumns, 3, labelMaker);
        recordReader.initialize(trainData);

        DataSetIterator dataIter = new RecordReaderDataSetIterator(recordReader, 1, 1, outputNum);

При использовании DenseLayer:

Exception in thread "main" org.deeplearning4j.exception.DL4JInvalidInputException: Input that is not a matrix; expected matrix (rank 2), got rank 4 array with shape [1, 3, 32, 32]. Missing preprocessor or wrong input type? (layer name: layer0, layer index: 0, layer type: DenseLayer)

При использовании ConvolutionLayer ошибка происходит в OutputLayer:

Exception in thread "main" org.deeplearning4j.exception.DL4JInvalidInputException: Input that is not a matrix; expected matrix (rank 2), got rank 4 array with shape [1, 1000, 28, 28]. Missing preprocessor or wrong input type? (layer name: layer1, layer index: 1, layer type: OutputLayer)

Моя попытка загрузки изображений неправильная или моя сеть неправильно настроена?

Конфигурация:

MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder()
                .list()
                .layer(0, new ConvolutionLayer.Builder()
                        .nIn(3) // Number of input datapoints.
                        .nOut(1000) // Number of output datapoints.
                        .activation(Activation.RELU) // Activation function.
                        .weightInit(WeightInit.XAVIER) // Weight initialization.
                        .build())
                .layer(1, new OutputLayer.Builder(LossFunctions.LossFunction.NEGATIVELOGLIKELIHOOD)
                        .nIn(1000)
                        .nOut(outputNum)
                        .activation(Activation.SOFTMAX)
                        .weightInit(WeightInit.XAVIER)
                        .build())
                .build();

1 Ответ

0 голосов
/ 05 апреля 2020

Самый простой способ - использовать опцию конфигурации .setInputType при определении сети. Он настроит все необходимые препроцессоры и рассчитает все правильные значения .nIn.

Еще раз взглянем на этот пример https://github.com/eclipse/deeplearning4j-examples/blob/master/dl4j-examples/src/main/java/org/deeplearning4j/examples/convolution/mnist/MnistClassifier.java#L156

Когда вы используете .setInputType способ настройки сети, вам вообще не нужно устанавливать какие-либо значения .nIn - вы все равно можете это сделать, как видно из примера, который я привел, но обычно там нет веских причин для этого.

...