2016-08-29 1 views
0

いくつかの深い学習アルゴリズムを実装するために現在nd4jとdl4jを使用しています。しかし、私はdatavec + dl4jを最初に働かせることはできません。ここでdl4j - 非2次元行列の行数を取得できません

私のイメージコンバータです:ここで

public class ImageConverter { 

    private static Logger log = LoggerFactory.getLogger(ImageConverter.class); 

    public DataSetIterator Convert() throws IOException, InterruptedException { 
     log.info("Start to convert images..."); 

     File parentDir = new File(System.getProperty("user.dir"), "src/main/resources/images/"); 
     ParentPathLabelGenerator parentPathLabelGenerator = new ParentPathLabelGenerator(); 

     ImageRecordReader recordReader = new ImageRecordReader(28,28,1,parentPathLabelGenerator); 

     FileSplit fs = new FileSplit(parentDir); 
     InputSplit[] filesInDirSplit = fs.sample(null, 100); 

     recordReader.initialize(filesInDirSplit[0]); 
     DataSetIterator dataIter = new RecordReaderDataSetIterator(recordReader, 2, 1, 2); 

     log.info("Image convert finished."); 

     return dataIter; 
    } 

} 

がメインクラスです:画像フォルダに

ImageConverter icv = new ImageConverter(); 
     DataSetIterator dataSetIterator = icv.Convert(); 

     log.info("Build model...."); 
     int numEpochs = 10; 

     MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder() 
       .seed(123) 
       .optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT) 
       .iterations(1) 
       .learningRate(0.006) 
       .updater(Updater.NESTEROVS).momentum(0.9) 
       .regularization(true).l2(1e-4) 
       .list() 
       .layer(0, new ConvolutionLayer.Builder(5, 5) 
         .nIn(28 * 28) 
         .stride(1, 1) 
         .nOut(20) 
         .activation("identity") 
         .build()) 
       .layer(1, new OutputLayer.Builder(LossFunction.NEGATIVELOGLIKELIHOOD) 
         .nIn(24 * 24) 
         .nOut(2) 
         .activation("softmax") 
         .build()) 
       .pretrain(false) 
       .backprop(true) 
       .build(); 

     MultiLayerNetwork model = new MultiLayerNetwork(conf); 
     model.init(); 
     model.setListeners(new ScoreIterationListener(1)); 


     log.info("Train model...."); 
     for(int i=0; i<numEpochs; i++){ 
      model.fit(dataSetIterator); 
     } 

、私はサブフォルダabにあるいくつかのグレースケール28x28イメージを持っていますそれぞれ、

ただし、Exception in thread "main" java.lang.IllegalStateException: Unable to get number of of rows for a non 2d matrixがスローされます。

dataSetIterator.next().toString()によってデータを見ると、それはのようなものです:mnisterIterator.next().toString()のようなものである必要があり、また、dataSetIterator.next().get(0).toString()の出力は例の

[[[[...], 
... 
]]] 

=================OUTPUT================== 
[1.00, 0.00] 

そしてmnisterIteratorです

[[[...], 
... 
]] 

=================OUTPUT================== 
[[1.00, 0.00], 
[1.00, 0.00]] 

[[...]...] 
=================OUTPUT================== 
[[0.00, 0.00, 1.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00], 
...] 

返されたdataSetIteratorが間違った形式のデータを返すと推測しました。

誰かがそれを修正する方法を知っていますか?

答えて

1

2D行列を必要としています。

4D及び2dはちょうど畳み込み層の設定を指定して、私たちには関係ありません:あなたはもうあなたは議論が容易になるだろうと思うのトラブルに直面した場合 https://github.com/deeplearning4j/dl4j-examples/blob/master/dl4j-examples/src/main/java/org/deeplearning4j/examples/convolution/LenetMnistExample.java#L84

、私たちのギッターに来る: https://gitter.im/deeplearning4j/deeplearning4j

ありがとうございます!

関連する問題