0

現在、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そこから、返されたデータに間違った形式のデータが含まれていたと推測されます。

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

4

2 に答える 2

1

これは、例ですでに実装されています。

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 の gitter に アクセスしてください。

ありがとう!

于 2016-09-09T06:52:43.623 に答える
0

データセットは 4 次元行列ですが、MNist には 2 次元行列が必要ですhttps://github.com/deeplearning4j/deeplearning4j/issues/2010

于 2016-09-09T03:47:12.653 に答える