我正在学习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]]
答案 0 :(得分:2)
您不应该将softmax输出用于二进制或多类。你改为sigmoid和二进制xent。
此外,此代码看起来有点旧。确保您使用的是0.9.1。不要使用重建交叉熵 - >使用KL Divergence 如果你正在进行无监督学习(自动编码器等),但在这种情况下,你甚至不应该使用侦察错误。
此外,迭代旋钮将在下一个版本中消失。请改用循环。那个迭代旋钮是遗留的(只是平均时间为1)
同样,我强烈建议您更贴近我们的例子。我们拥有您需要的所有内容,用于多类分类或任何用例。如果您无法找到某些内容,请尝试在回购中进行关键字搜索。如果做不到这一点,请在这里询问我们的社区观众。