如何配置神经网络在DL4J中产生多个二进制输出

时间:2018-01-17 01:27:08

标签: java neural-network multiclass-classification dl4j

我正在学习DL4J,我想配置一个可以接受双值元组的网络,并生成一个二进制值元组,其中多个值可以设置为1,其他设置为0.在神经网络的语言中,我认为这是多类单热编码吗?

示例:

[3.5,  2.9, 15.0] -> [0, 0, 1, 0, 1]
[2.5, 12.5,  5.0] -> [1, 1, 0, 0, 1]
[5.9, 71.3,  0.7] -> [0, 1, 1, 0, 0]

等。

我试过这个:

MultiLayerConfiguration multiLayerConfiguration = 
    new NeuralNetConfiguration.Builder()
        .seed(System.nanoTime())
        .iterations(10000)
        .optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT)
        .learningRate(0.1)
        .useDropConnect(false)
        .biasInit(0)
        .miniBatch(false)
        .updater(Updater.NESTEROVS)
        .list()
        .layer(0, new DenseLayer.Builder()
            .nIn(3)
            .nOut(8)
            .weightInit(WeightInit.XAVIER)
            .activation(Activation.SIGMOID)
            .build())
        .layer(1, new OutputLayer.Builder()
            .nIn(8)
            .nOut(5)
            .weightInit(WeightInit.XAVIER)
            .activation(Activation.SOFTMAX)
            .lossFunction(LossFunctions.LossFunction.RECONSTRUCTION_CROSSENTROPY)
            .build())
        .pretrain(false)
        .backprop(true)
        .build();

但我似乎在输出中获得小数值,就像网络试图均匀分配激活一样。如何配置网络使其为多个1和0分类?

例如,如果输出是3维,我希望这样:

[[0.00,  0.49,  0.51],  
 [0.50,  0.00,  0.50],  
 [0.50,  0.50,  0.00],  
 [0.33,  0.33,  0.34],  
 [0.00,  0.00,  1.00]]

真的是这样:

[[0.00,  1.00,  1.00],  
 [1.00,  0.00,  1.00],  
 [1.00,  1.00,  0.00],  
 [1.00,  1.00,  1.00],  
 [0.00,  0.00,  1.00]]

1 个答案:

答案 0 :(得分:2)

您不应该将softmax输出用于二进制或多类。你改为sigmoid和二进制xent。

此外,此代码看起来有点旧。确保您使用的是0.9.1。不要使用重建交叉熵 - >使用KL Divergence 如果你正在进行无监督学习(自动编码器等),但在这种情况下,你甚至不应该使用侦察错误。

此外,迭代旋钮将在下一个版本中消失。请改用循环。那个迭代旋钮是遗留的(只是平均时间为1)

同样,我强烈建议您更贴近我们的例子。我们拥有您需要的所有内容,用于多类分类或任何用例。如果您无法找到某些内容,请尝试在回购中进行关键字搜索。如果做不到这一点,请在这里询问我们的社区观众。