【问题标题】:DL4J Prediction FormattingDL4J 预测格式
【发布时间】:2017-12-27 12:05:13
【问题描述】:

我有两个关于 deeplearning4j 的问题有些相关。

  1. 当我执行“INDArray predicted = model.output(features,false);”生成预测时,得到模型预测的标签;它是 0 或 1。我试图寻找一种方法来获得概率(值介于 0 和 1 之间)而不是严格地为 0 或 1。当您需要为模型应该考虑的阈值设置阈值时,这很有用0 以及它应该被视为 1 的情况。例如,您可能希望您的模型为任何高于或等于 0.9 的预测输出“1”,否则输出“0”。
  2. 我的第二个问题是,即使只有两种可能性,我也不确定为什么输出表示为二维数组(如下代码所示),因此最好用一个值表示 -特别是如果我们希望它是一个概率(问题 #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


    【解决方案1】:

    我将在线回答您的问题,但我只想指出: 我建议查看我们的文档和示例: https://github.com/deeplearning4j/dl4j-examples http://deeplearning4j.org/quickstart

    1. 100% 的 0 或 1 只是一个调整不良的神经网络。这根本不是事情的运作方式。默认情况下,softmax 返回概率。你的神经网络调得很差。也看看更新 dl4j。我不确定您使用的是哪个版本,但我们至少有一年没有在激活中使用字符串了?从我们开始,您似乎跳过了很多步骤。我将再次重申,至少从上面看一下作为起点,而不是使用旧代码。

    2. 你看到的只是标准的深度学习 101。所以我要给你的建议可以在互联网上找到,并且适用于任何深度学习软件。两个标签的 softmax 将每一行的总和为 1。如果您想要 1 个标签,请使用具有 1 个输出和不同损失函数的 sigmoid。我们使用 softmax 是因为它适用于任意数量的输出,您所要做的就是改变输出的数量,而不必在此之上更改损失函数激活函数。

    【讨论】:

    • 谢谢。为阅读此内容的任何人添加一些细节: 第 1 点:我能够通过更改架构定义中的输出标签数据类型来获得概率(使用“.addColumnDouble”而不是“.addColumnInteger”)。第 2 点:你是绝对正确的。我被代码迷住了,在发布问题时错过了这一点。
    猜你喜欢
    • 2019-03-02
    • 1970-01-01
    • 1970-01-01
    • 2020-05-26
    • 2017-04-08
    • 1970-01-01
    • 2016-04-20
    • 2022-06-24
    • 1970-01-01
    相关资源
    最近更新 更多