我试着用DeepLearning4J 0.7训练一台受限的玻尔兹曼机器,但没有成功。我发现的所有示例要么没有做任何有用的事情,要么不再使用DeepLearning4J 0.7。
我需要训练一个具有对比散度的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重建输入?
发布于 2018-03-20 07:03:06
我意识到这个问题是老的,但最近的活动在我的流程中揭示了这一点。我只想说,我最近在DL4j中使用了RBM,包括单层和多层。他们可能没有得到官方的支持,但他们是有效的。我还偶然发现了reconstruct。要测试模型,您应该使用output,就像在FF网络中一样。就你的情况而言,我想应该是:
INDArray in = next.getFeatureMatrix();
INDArray out = model.output(in);增加了几个部分:
我用0.9.1
发布于 2017-08-26 09:47:31
我已经在项目的Gitter通道上和亚当·吉布森(作者)谈过这个问题。他说,他们实际上已经放弃了对RBM的支持,除了代码库,所以任何类型的RBM错误都可能发生,而且不会被修复。
他们放弃的原因是因为RBM在总体上已经被VAE (变分自动编码器)所取代,所以他们推动人们使用它。
发布于 2018-03-19 18:54:46
放弃RBM或其他类型的NNs意味着DL4J并不支持所有的深度学习用例。不幸的是,DL4J不是一个完整的DL库,更不用说与许多替代方法相比缺乏文档了。
https://stackoverflow.com/questions/41143092
复制相似问题