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

How to Configure Neural Network to Produce Multiple Binary Outputs in DL4J

我正在学习DL4J,我想配置一个网络,它可以接受一个双精度值的元组,并产生一个二进制值的元组,其中它们的倍数可以设置为 1,其他设置为0。在神经网络的语言中,我会认为这是多class单热编码吗?

示例:

[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 作为 class化验?

例如,如果输出是 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]]

您不应该对二元或多元使用 softmax 输出 class。你改用 sigmoid 和二进制 xent。

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

此外,迭代旋钮将在下一个版本中消失。请改用 for 循环。迭代旋钮是遗留的(同时将其保留为 1)

我再次强烈建议您更深入地学习我们的示例。我们拥有您需要的一切,可用于 multi class classification 或任何用例。如果找不到,请尝试在存储库中进行关键字搜索。如果做不到这一点,请在我们的社区 gitter 上询问。