2016-12-14 6 views
3

나는 DeepLearning4J 0.7로 제한된 볼츠만 머신 (RBM)을 훈련 시키려고했지만 성공하지는 못했다. 내가 찾은 모든 예제는 DeepLearning4J 0.7로 더 이상 유용하지 않거나 더 이상 작동하지 않습니다.RBM을 교육하고 DeepLearning4J로 입력을 재구성하는 방법은 무엇입니까?

Contrastive Divergence를 사용하여 하나의 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의 거터 채널 (매우 활발한 채널)에이 질문을 올리십시오. https://gitter.im/deeplearning4j/deeplearning4j – tremstat

+0

답변이 없으면 지터를 확인하겠습니다. 감사. –

+0

성공 했습니까? 여전히 최신 릴리스 (0.9.1)에서 동일한 문제로 어려움을 겪고 있습니다. –

답변

1

저는이 문제에 대해 the project's Gitter channel의 Adam Gibson (작성자)과 통화했습니다. 그는 실제로 RBM에 대한 지원을 코드베이스를 제외한 다른 모든 것에 버렸다고 말합니다. 그래서 어떤 종류의 RBM 버그가 발생할 수 있으며 수정되지 않을 것입니다.

이유는 RBM이 대체로 VAE (Variational Auto-Encoder)로 대체 되었기 때문에 사람들이 대신 사용하도록 유도하기 때문입니다.