【问题标题】:Need some help for deeplearning4j single RBM usage对于 deeplearning4j 单 RBM 使用需要一些帮助
【发布时间】:2015-09-30 05:49:29
【问题描述】:

我有一堆传感器,我真的只想重建输入。

所以我想要的是这样的:

  1. 训练完模型后,我将传入我的特征矩阵
  2. 取回重构的特征矩阵
  3. 我想调查哪些传感器值与重建值完全不同

因此,我认为 RBM 将是正确的选择,并且由于我习惯了 Java,因此我尝试使用 deeplearning4j。但是我很早就被卡住了。如果您运行以下代码,我将面临 2 个问题。

  1. 结果与正确预测相差甚远,大部分都只是[1.00,1.00,1.00]。

  2. 我希望返回 4 个值(这是预期要重构的输入数量)

那么我必须调整什么来获得 a) 更好的结果和 b) 恢复重建的输入?

public static void main(String[] args) {
    // Customizing params
    Nd4j.MAX_SLICES_TO_PRINT = -1;
    Nd4j.MAX_ELEMENTS_PER_SLICE = -1;
    Nd4j.ENFORCE_NUMERICAL_STABILITY = true;
    final int numRows = 4;
    final int numColumns = 1;
    int outputNum = 3;
    int numSamples = 150;
    int batchSize = 150;
    int iterations = 100;
    int seed = 123;
    int listenerFreq = iterations/5;

    DataSetIterator iter = new IrisDataSetIterator(batchSize, numSamples);

    // Loads data into generator and format consumable for NN
    DataSet iris = iter.next();
    iris.normalize();
    //iris.scale();
    System.out.println(iris.getFeatureMatrix());

    NeuralNetConfiguration conf = new NeuralNetConfiguration.Builder()
            // Gaussian for visible; Rectified for hidden
            // Set contrastive divergence to 1
            .layer(new RBM.Builder()
                    .nIn(numRows * numColumns) // Input nodes
                    .nOut(outputNum) // Output nodes
                    .activation("tanh") // Activation function type
                    .weightInit(WeightInit.XAVIER) // Weight initialization
                    .lossFunction(LossFunctions.LossFunction.XENT)
                    .updater(Updater.NESTEROVS)
                    .build())
            .seed(seed) // Locks in weight initialization for tuning
            .iterations(iterations)
            .learningRate(1e-1f) // Backprop step size
            .momentum(0.5) // Speed of modifying learning rate
            .optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT) // ^^ Calculates gradients
            .build();

    Layer model = LayerFactories.getFactory(conf.getLayer()).create(conf);
    model.setListeners(Arrays.asList((IterationListener) new ScoreIterationListener(listenerFreq)));

    model.fit(iris.getFeatureMatrix());
    System.out.println(model.activate(iris.getFeatureMatrix(), false));
}

【问题讨论】:

标签: java deep-learning rbm deeplearning4j


【解决方案1】:

对于 b),当您调用 activate() 时,您会得到一个“nlayers”数组列表。列表中的每个数组都是一层的激活。数组本身由行组成:每个输入向量 1 行;每列包含该层中每个神经元的激活和该观察(输入)。 一旦所有层都被一些输入激活,您就可以使用 RBM.propDown() 方法进行重建。

至于a),恐怕要正确训练RBM非常棘手。 所以你真的很想玩每一个参数,更重要的是, 在训练期间监控各种指标,这些指标会给你一些关于训练是否正确的提示。就个人而言,我喜欢绘图:

  • 训练语料上的score(),即每次梯度更新后的重构误差;检查它是否减少。
  • 另一个开发语料库上的 score():在发生过拟合时警告有用;
  • 参数向量的范数:对分数影响很大
  • 两个激活图(= 语料库上一层激活神经元的 XY 矩形图),在初始化之后和 N 步之后:这有助于检测不可靠的训练(例如:当所有都是黑色/白色时,当大部分的所有神经元从未被激活,等等)

【讨论】:

    猜你喜欢
    • 2011-09-26
    • 2011-01-13
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    • 2010-10-23
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    相关资源
    最近更新 更多