いくつかの深い学習アルゴリズムを実装するために現在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);
}
、私はサブフォルダa
、b
にあるいくつかのグレースケール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
が間違った形式のデータを返すと推測しました。
誰かがそれを修正する方法を知っていますか?