需要一些帮助deeplearning4j单RBM使用

时间:2015-09-30 05:49:30

标签: java deep-learning rbm deeplearning4j

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

所以我想要的是:

  1. 在我训练模型后,我将传递我的特征矩阵
  2. 重新获得重建的特征矩阵
  3. 我想调查哪些传感器值与重建值完全不同
  4. 因此我认为RBM将是正确的选择,因为我已经习惯了Java,所以我尝试使用deeplearning4j。但我很早就陷入了困境。如果您运行以下代码,我将遇到2个问题。

    1. 结果远离正确的预测,大多数只是[1.00,1.00,1.00]。

    2. 我希望得到4个值(这是预期要重建的输入数量)

    3. 那么我需要调整以获得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));
      }
      

1 个答案:

答案 0 :(得分:0)

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

至于a),我担心正确训练RBM是非常棘手的。 所以你真的想要玩每个参数,更重要的是, 在培训过程中监控各种指标,这些指标可以为您提供有关是否正确培训的一些提示。就个人而言,我喜欢绘图:

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