のんびりしているエンジニアの日記

ソフトウェアなどのエンジニア的な何かを書きます。

最近噂のDeepLearningLibrary DeepLearning4jを使ってみた(後編)

Sponsored Links

DeepLearning 4jの解説の後編を進めていきたいと思います。

皆さんこんにちは
お元気でしょうか。私はSWをエンジョイしています。

一番上には今日話すこと持ってこないと、twitterで拡散された時にタイトル以外
何がいいたいのかわからない内容になってしまいますね。

今日は前回行ったDeepLearning 4jの解説の続きを行っていきます。
メインは具体的なソースコードの解説です。

Dataset構築

CSVファイルの読み込み

RecordReader recordReader = new CSVRecordReader(0,",");
recordReader.initialize(new FileSplit(new ClassPathResource("iris.txt").getFile()));
DataSetIterator iterator = new RecordReaderDataSetIterator(recordReader,3,3);
DataSet next = iterator.next();

Model構築

Source Code

まずは、MultiLayerPerceptronの例を見てみます。

MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder()
        .seed(seed)
        .iterations(iterations)
        .learningRate(1e-3)
        .l1(0.3).regularization(true).l2(1e-3)
        .constrainGradientToUnitNorm(true)
        .list(3)
        .layer(0, new DenseLayer.Builder().nIn(numInputs).nOut(100)
                .activation("tanh")
                .weightInit(WeightInit.XAVIER)
                .build())
        .layer(1, new DenseLayer.Builder().nIn(100).nOut(50)
                .activation("tanh")
                .weightInit(WeightInit.XAVIER)
                .build())
        .layer(2, new OutputLayer.Builder(LossFunction.MCXENT)
                .weightInit(WeightInit.XAVIER)
                .activation("softmax")
              .nIn(50).nOut(outputNum).build())
        .backprop(true).pretrain(false)
        .build();
MultiLayerNetwork model = new MultiLayerNetwork(conf);
model.init();
model.setListeners(Arrays.asList((IterationListener) new ScoreIterationListener(listenerFreq)));
while(iter.hasNext()) {
    DataSet iris = iter.next();
    iris.normalizeZeroMeanZeroUnitVariance();
    model.fit(iris);
}
Evaluation eval = new Evaluation();
DataSetIterator iterTest = new IrisDataSetIterator(numSamples, numSamples);
DataSet test = iterTest.next();
test.normalizeZeroMeanZeroUnitVariance();
INDArray output = model.output(test.getFeatureMatrix());
eval.eval(test.getLabels(), output);
log.info(eval.stats());

解説

NeuralNetConfiguration.Builderのメソッド
メソッド 意味
seed 変数のseed
iterations 学習回数
learningRate 学習率
l1 l1正則化のパラメータ
l2 l2正則化のパラメータ
list ニューラルネットワークの層数
layer ニューラルネットワークのLayer,activationが活性化関数、nInが入力
backprop 誤差逆伝搬をonにする。(学習をon)
pretrain 事前学習のon off
configurationの読み込み

new MultiLayerNetwork(conf)を用いて、設定を読み込ませ、ネットワークを構築しています。

MultiLayerNetwork model = new MultiLayerNetwork(conf);
定期的なスコアの読み込み

setListnersを用いて、Scoreを定期的に出力する設定ができます。

model.setListeners(Arrays.asList((IterationListener) new ScoreIterationListener(listenerFreq)));

実際の出力は以下のようになっています。

o.d.o.l.ScoreIterationListener - Score at iteration 0 is 1.6539067225404582
o.d.o.l.ScoreIterationListener - Score at iteration 2 is 1.4139220929952463
o.d.o.l.ScoreIterationListener - Score at iteration 4 is 1.3286859775479634
o.d.o.l.ScoreIterationListener - Score at iteration 6 is 1.3062426062059402
o.d.o.l.ScoreIterationListener - Score at iteration 8 is 1.2940777707539002
o.d.o.l.ScoreIterationListener - Score at iteration 10 is 1.2514277131886284
o.d.o.l.ScoreIterationListener - Score at iteration 12 is 1.2353837197901805
o.d.o.l.ScoreIterationListener - Score at iteration 14 is 1.2143767691576481
予測結果の出力

model.outputに特徴ベクトルを読みこませることによって
modelから予測できる結果を出力します。

INDArray output = model.output(test.getFeatureMatrix());
予測結果の評価

eval.evalによって
accuracy,precision,recall,F1を計算します。

eval.eval(test.getLabels(), output);
log.info(eval.stats());

実際の出力

==========================Scores========================================
 Accuracy:  0.3333
 Precision: 0.3333
 Recall:    1
 F1 Score:  0.5
===========================================================================

解説してみたけれども、個人的にはPythonで書くNeural Networkに比べるとわかりにくい。
Theanoとchainerのようなタイプに慣れすぎて構造がわかりにくいからでしょうか。