gpt4 book ai didi

java - 需要一些关于 deeplearning4j 单 RBM 使用的帮助

转载 作者:太空宇宙 更新时间:2023-11-04 13:23:26 26 4
gpt4 key购买 nike

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

所以我想要的是这样的:

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

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

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

最佳答案

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

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

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

关于java - 需要一些关于 deeplearning4j 单 RBM 使用的帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32858693/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com