1

我正在学习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]]
4

1 回答 1

3

您不应该对二进制或多类使用 softmax 输出。你用 sigmoid 和 binary xent 代替。

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

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

再次,我强烈鼓励您更密切地遵循我们的示例。我们拥有您所需的一切,用于多类分类或任何用例。如果您找不到某些内容,请尝试在 repo 中进行关键字搜索。如果做不到这一点,请在我们的社区 gitter 上询问。

于 2018-01-17T03:38:32.710 回答