私は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で入力を再構築するにはどうすればよいですか?
非常にアクティブなDL4JのGitterチャンネルでこの質問を提起してください。https://gitter.im/deeplearning4j/deeplearning4j – tremstat
ここに回答がない場合、私はGitterをチェックします。ありがとう。 –
成功しましたか?まだ最新のリリース(0.9.1)で同じ問題を抱えています。 –