【发布时间】:2017-12-27 12:05:13
【问题描述】:
我有两个关于 deeplearning4j 的问题有些相关。
- 当我执行“INDArray predicted = model.output(features,false);”生成预测时,得到模型预测的标签;它是 0 或 1。我试图寻找一种方法来获得概率(值介于 0 和 1 之间)而不是严格地为 0 或 1。当您需要为模型应该考虑的阈值设置阈值时,这很有用0 以及它应该被视为 1 的情况。例如,您可能希望您的模型为任何高于或等于 0.9 的预测输出“1”,否则输出“0”。
- 我的第二个问题是,即使只有两种可能性,我也不确定为什么输出表示为二维数组(如下代码所示),因此最好用一个值表示 -特别是如果我们希望它是一个概率(问题 #1),它是一个值。
PS:如果与问题相关,在架构中,输出列是使用“.addColumnInteger”定义的。下面是所用代码的 sn-ps。
部分代码:
MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder()
.seed(seed)
.iterations(1)
.optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT)
.learningRate(learningRate)
.updater(org.deeplearning4j.nn.conf.Updater.NESTEROVS).momentum(0.9)
.list()
.layer(0, new DenseLayer.Builder()
.nIn(numInputs)
.nOut(numHiddenNodes)
.weightInit(WeightInit.XAVIER)
.activation("relu")
.build())
.layer(1, new OutputLayer.Builder(LossFunctions.LossFunction.NEGATIVELOGLIKELIHOOD)
.weightInit(WeightInit.XAVIER)
.activation("softmax")
.weightInit(WeightInit.XAVIER)
.nIn(numHiddenNodes)
.nOut(numOutputs)
.build()
)
.pretrain(false).backprop(true).build();
MultiLayerNetwork model = new MultiLayerNetwork(conf);
model.init();
model.setListeners(new ScoreIterationListener(10));
for (int n=0; n<nEpochs; n++) {
model.fit(trainIter);
}
Evaluation eval = new Evaluation(numOutputs);
while (testIter.hasNext()){
DataSet t = testIter.next();
INDArray features = t.getFeatureMatrix();
System.out.println("Input features: " + features);
INDArray labels = t.getLabels();
INDArray predicted = model.output(features,false);
System.out.println("Predicted output: "+ predicted);
System.out.println("Desired output: "+ labels);
eval.eval(labels, predicted);
System.out.println();
}
System.out.println(eval.stats());
运行上述代码的输出:
输入特征:[0.10, 0.34, 1.00, 0.00, 1.00]
预测输出:[1.00, 0.00]
期望的输出:[1.00, 0.00]
*我希望输出的样子(即单值概率):**
输入特征:[0.10, 0.34, 1.00, 0.00, 1.00]
预测输出:0.14
期望的输出:0.0
【问题讨论】:
标签: deeplearning4j