Я пытаюсь использовать 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();