現在、nd4j と dl4j を使用してディープ ラーニング アルゴリズムを実装しています。しかし、そもそもdatavec+dl4jが動作しません。
これが私の画像コンバーターです:
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
画像フォルダーには、それぞれサブフォルダーにグレースケールの 28x28 画像がいくつかありますb
。
ただしException in thread "main" java.lang.IllegalStateException: Unable to get number of of rows for a non 2d matrix
投げられる。
でデータを調べると、次のdataSetIterator.next().toString()
ようになります。
[[[...],
...
]]
=================OUTPUT==================
[[1.00, 0.00],
[1.00, 0.00]]
さらに、の出力dataSetIterator.next().get(0).toString()
は
[[[[...],
...
]]]
=================OUTPUT==================
[1.00, 0.00]
例の mnisterIterator は次のmnisterIterator.next().toString()
ようになります。
[[...]...]
=================OUTPUT==================
[[0.00, 0.00, 1.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00],
...]
dataSetIterator
そこから、返されたデータに間違った形式のデータが含まれていたと推測されます。
誰もそれを修正する方法を知っていますか?