Обнаружение аномалий на моих собственных изображениях с использованием deeplearning4j

Я собираюсь выполнить обнаружение аномалий на своих собственных изображениях, используя пример на платформе deeplearning4j. И я изменяю код следующим образом:

    int rngSeed=123;
    Random rnd = new Random(rngSeed);
    int width=28;
    int height=28;
    int batchSize = 128;
    MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder()
            .seed(12345)
            .iterations(1)
            .weightInit(WeightInit.XAVIER) 
            .updater(Updater.ADAGRAD)
            .activation(Activation.RELU)
            .optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT)
            .learningRate(0.05)
            .regularization(true).l2(0.0001)
            .list()
            .layer(0, new DenseLayer.Builder().nIn(784).nOut(250)
                    .build())
            .layer(1, new DenseLayer.Builder().nIn(250).nOut(10)
                    .build())
            .layer(2, new DenseLayer.Builder().nIn(10).nOut(250)
                    .build())
            .layer(3, new OutputLayer.Builder().nIn(250).nOut(784)
                    .lossFunction(LossFunctions.LossFunction.MSE)
                    .build())
            .pretrain(false).backprop(true)
            .build();

    MultiLayerNetwork net = new MultiLayerNetwork(conf);
    net.setListeners(Collections.singletonList((IterationListener) new ScoreIterationListener(1)));
    File trainData = new File("mnist_png/training");
    FileSplit fsTrain = new FileSplit(trainData, NativeImageLoader.ALLOWED_FORMATS, rnd);

    ImageRecordReader recorderReader = new ImageRecordReader(height, width);
    recorderReader.initialize(fsTrain);


    DataSetIterator dataIt = new RecordReaderDataSetIterator(recorderReader, batchSize);
    List<INDArray> featuresTrain = new ArrayList<>();
    while(dataIt.hasNext()){
        DataSet ds = dataIt.next();
        featuresTrain.add(ds.getFeatureMatrix());
    }


    System.out.println("************ training **************");
    int nEpochs = 30;
    for( int epoch=0; epoch<nEpochs; epoch++ ){
        for(INDArray data : featuresTrain){
            net.fit(data,data);
        }
        System.out.println("Epoch " + epoch + " complete");
    }

И это вызвало исключение во время обучения:

Exception in thread "main" org.deeplearning4j.exception.DL4JInvalidInputException: Input that is not a matrix; expected matrix (rank 2), got rank 4 array with shape [128, 1, 28, 28]
    at org.deeplearning4j.nn.layers.BaseLayer.preOutput(BaseLayer.java:363)
    at org.deeplearning4j.nn.layers.BaseLayer.activate(BaseLayer.java:384)
    at org.deeplearning4j.nn.layers.BaseLayer.activate(BaseLayer.java:405)
    at org.deeplearning4j.nn.multilayer.MultiLayerNetwork.activationFromPrevLayer(MultiLayerNetwork.java:590)
    at org.deeplearning4j.nn.multilayer.MultiLayerNetwork.feedForwardToLayer(MultiLayerNetwork.java:713)
    at org.deeplearning4j.nn.multilayer.MultiLayerNetwork.computeGradientAndScore(MultiLayerNetwork.java:1821)
    at org.deeplearning4j.optimize.solvers.BaseOptimizer.gradientAndScore(BaseOptimizer.java:151)
    at org.deeplearning4j.optimize.solvers.StochasticGradientDescent.optimize(StochasticGradientDescent.java:54)
    at org.deeplearning4j.optimize.Solver.optimize(Solver.java:51)
    at org.deeplearning4j.nn.multilayer.MultiLayerNetwork.fit(MultiLayerNetwork.java:1443)
    at org.deeplearning4j.nn.multilayer.MultiLayerNetwork.fit(MultiLayerNetwork.java:1408)
    at org.deeplearning4j.examples.dataExamples.AnomalyTest.main(AnomalyTest.java:86)

Кажется, что мой входной набор данных имеет 4 столбца, в то время как ему нужно всего 2 столбца, поэтому вопрос в том, как преобразовать imagerecorderread или что-то еще, чтобы он работал правильно?


person Jerome tan    schedule 10.01.2017    source источник


Ответы (1)


Итак, прежде всего, вы можете понять, что такое тензор: http://nd4j.org/tensor

Считыватель записей возвращает многомерное изображение, вам необходимо сгладить его, чтобы его можно было использовать с 2D-нейронной сетью, если вы не планируете использовать CNN для части вашего обучения.

Если вы посмотрите на исключение (опять же, вы действительно должны быть знакомы с ndarrays, они не новы и используются в каждой библиотеке глубокого обучения): вы увидите форму: [128, 1, 28, 28]

Это размер пакета по каналам по строкам x столбцам. Вам нужно сделать: .setInputType(InputType.convolutional(28,28,1))

Это скажет dl4j, что ему нужно сгладить 4d до 2d. В данном случае это указывает на наличие строк, столбцов, каналов размером 28 x 28 x 1.

Если вы добавите это в конец конфигурации, все будет работать.

Следует отметить, что если вы пытаетесь обнаружить аномалии, у нас также есть вариационные автоэнкодеры, которые вы также можете изучить.

person Adam Gibson    schedule 10.01.2017
comment
Он выдал новое исключение: - person Jerome tan; 10.01.2017
comment
Исключение в потоке main java.lang.IllegalStateException: несовпадение длин: [28] != [100352] в org.nd4j.linalg.util.LinAlgExceptions.assertSameLength(LinAlgExceptions.java:40) - person Jerome tan; 10.01.2017
comment
Это был пограничный случай с метками 4d и 2d. Сообщите о проблеме: github.com/deeplearning4j/deeplearning4j/issues. А пока просто измените форму. самим собой. Это довольно тривиальное исправление. - person Adam Gibson; 10.01.2017