2016-12-14 16 views
3

私はDeepLearning4J 0.7で制限付きボルツマンマシン(RBM)をトレーニングしようとしていますが、成功していません。私が見つけたすべての例は、DeepLearning4J 0.7で何も役に立たない、またはこれ以上作業していないかのいずれかです。DeepLearning4JでRBMをトレーニングして入力を再構築するにはどうすればよいですか?

Contrastive Divergenceを使用して1つのRBMをトレーニングし、再構成エラーを計算する必要があります。これは、コンパイルし、各エポックでのいくつかのスコアを印刷

import org.nd4j.linalg.factory.Nd4j; 
import org.deeplearning4j.datasets.fetchers.MnistDataFetcher; 
import org.deeplearning4j.nn.conf.layers.RBM; 
import org.deeplearning4j.nn.api.Layer; 
import static org.deeplearning4j.nn.conf.layers.RBM.VisibleUnit; 
import static org.deeplearning4j.nn.conf.layers.RBM.HiddenUnit; 
import org.deeplearning4j.optimize.api.IterationListener; 
import org.deeplearning4j.datasets.iterator.impl.MnistDataSetIterator; 
import org.deeplearning4j.eval.Evaluation; 
import org.deeplearning4j.nn.api.OptimizationAlgorithm; 
import org.deeplearning4j.nn.conf.MultiLayerConfiguration; 
import org.deeplearning4j.nn.conf.NeuralNetConfiguration; 
import org.deeplearning4j.nn.conf.Updater; 
import org.deeplearning4j.nn.multilayer.MultiLayerNetwork; 
import org.deeplearning4j.nn.weights.WeightInit; 
import org.deeplearning4j.optimize.listeners.ScoreIterationListener; 
import org.nd4j.linalg.dataset.DataSet; 
import org.nd4j.linalg.dataset.api.iterator.DataSetIterator; 
import org.nd4j.linalg.lossfunctions.LossFunctions; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.nd4j.linalg.api.ndarray.INDArray; 

public class experiment3 { 
    private static final Logger log = LoggerFactory.getLogger(experiment3.class); 

    public static void main(String[] args) throws Exception { 
     DataSetIterator mnistTrain = new MnistDataSetIterator(100, 60000, true); 

     MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder() 
      .regularization(false) 
      .iterations(1) 
      .optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT) 
      .list() 
      .layer(0, new RBM.Builder() 
        .nIn(784).nOut(500) 
        .weightInit(WeightInit.XAVIER) 
        .lossFunction(LossFunctions.LossFunction.RECONSTRUCTION_CROSSENTROPY) 
        .updater(Updater.NESTEROVS) 
        .learningRate(0.1) 
        .momentum(0.9) 
        .k(1) 
        .build()) 
      .pretrain(true).backprop(false) 
      .build(); 

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

     for(int i = 0; i < 50; i++) { 
      model.fit(mnistTrain); 
     } 
    } 
} 

が、それは減少しなければならないとき、スコアが増強し、私は再構築を行うにはどのような方法を発見していない。ここで

は、私がこれまで持っているものです。

私は再構築機能を使用して距離を計算することを試みた:

 while(mnistTrain.hasNext()){ 
      DataSet next = mnistTrain.next(); 
      INDArray in = next.getFeatureMatrix(); 
      INDArray out = model.reconstruct(in, 1); // tried with 0 but arrayindexoutofbounds 

      log.info("distance(1):" + in.distance1(out)); 
     } 

が、距離は、モデルが不可能である単一エポック、ために訓練されていない場合でも、常に0.0各要素についてです。

これはRBMをトレーニングする正しい方法ですか?単一のRBMで入力を再構築するにはどうすればよいですか?

+0

非常にアクティブなDL4JのGitterチャンネルでこの質問を提起してください。https://gitter.im/deeplearning4j/deeplearning4j – tremstat

+0

ここに回答がない場合、私はGitterをチェックします。ありがとう。 –

+0

成功しましたか?まだ最新のリリース(0.9.1)で同じ問題を抱えています。 –

答えて

1

私はこの問題について、the project's Gitter channelのAdam Gibson(著者)と話しました。彼は実際にRBMのサポートをコードベース以外のすべてに落としていると言っているので、どんな種類のRBMバグも起こる可能性があり修正されません。

RBMが一般的にVAE(Variational Auto-Encoder)に取って替わっているため、代わりにRBMが使用されるためです。

関連する問題