1

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

所以我想要的是这样的:

  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));
}
4

1 回答 1

0

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

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

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