2017-01-10 9 views
0

Я собираюсь сделать обнаружение аномалий на моих собственных изображениях, используя пример на платформе 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 columes, поэтому вопрос как конвертировать imagerecorderread или что-то еще, чтобы заставить его работать правильно?

ответ

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

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

Обратите внимание, что если вы пытаетесь обнаружить аномалию, у нас также есть вариационные автокодеры, с которыми вы, возможно, захотите взглянуть.

+0

Это бросило новое исключение: –

+0

Исключения в потоке "основной" java.lang.IllegalStateException: Мис соответствует длине: [28] = [100352] \t на org.nd4j.linalg.util.LinAlgExceptions.assertSameLength (LinAlgExceptions .java: 40) –

+0

Это был крайный кейс с 4d и 2d ярлыками. Пожалуйста, укажите проблему: https://github.com/deeplearning4j/deeplearning4j/issues На данный момент просто переделайте себя. Это довольно тривиальное исправление. –