如何配置神经网络以在 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 上询问。
我正在学习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 上询问。