[英]How to Configure Neural Network to Produce Multiple Binary Outputs in DL4J
[英]The XOR neural network written in DL4J does not work
我開始與 DL4j 框架一起研究神經網絡,並從 XOR 訓練開始。 但無論我做什么,我都會得到錯誤的結果。
MultiLayerConfiguration networkConfiguration = new NeuralNetConfiguration.Builder()
.weightInit(WeightInit.SIGMOID_UNIFORM)
.list()
.layer(new DenseLayer.Builder()
.nIn(2).nOut(2)
.activation(Activation.SIGMOID)
.build())
.layer( new DenseLayer.Builder()
.nIn(2).nOut(2)
.activation(Activation.SIGMOID)
.build())
.layer( new OutputLayer.Builder()
.nIn(2).nOut(1)
.activation(Activation.SIGMOID)
.lossFunction(LossFunctions.LossFunction.XENT)
.build())
.build();
MultiLayerNetwork network = new MultiLayerNetwork(networkConfiguration);
network.setListeners(new ScoreIterationListener(1));
network.init();
INDArray input = Nd4j.createFromArray(new double[][]{{0,1},{0,0},{1,0},{1,1}});
INDArray output = Nd4j.createFromArray(new double[][]{{0^1},{0^0},{1^0},{1^1}});
// INDArray output = Nd4j.createFromArray(new double[]{0^1,0^0,1^1,1^0});
//DataSet dataSet = new org.nd4j.linalg.dataset.DataSet(input,output);
for (int i = 0; i < 10000; i++) {
network.fit(input,output);
}
INDArray res = network.output(input,false);
System.out.print(res);
學習成果:
[[0.5748],
[0.5568],
[0.4497],
[0.4533]]
這看起來像一個老例子。 你是從哪里弄來的? 請注意,該項目不認可或支持人們從中提取的隨機示例。 如果這是來自書中的內容,請注意這些示例在這一點上已有幾年的歷史,不應使用。
這種配置受到我喜歡稱之為“玩具問題綜合症”的影響。 Dl4j 默認采用 minibatch,因此默認相對於輸入示例的 minibatch 大小裁剪學習。 如果您在現實世界中做任何事情,這就是 99% 的問題是如何設置的。
這意味着如果您對 memory 中的整個集合進行玩具問題,網絡所采取的每一步實際上並不是完整的步驟。 我們最新的示例通過為此關閉 minibatch 來處理此問題:
MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder()
.updater(new Sgd(0.1))
.seed(seed)
.biasInit(0) // init the bias with 0 - empirical value, too
// The networks can process the input more quickly and more accurately by ingesting
// minibatches 5-10 elements at a time in parallel.
// This example runs better without, because the dataset is smaller than the mini batch size
.miniBatch(false)
.list()
.layer(new DenseLayer.Builder()
.nIn(2)
.nOut(4)
.activation(Activation.SIGMOID)
// random initialize weights with values between 0 and 1
.weightInit(new UniformDistribution(0, 1))
.build())
.layer(new OutputLayer.Builder(LossFunctions.LossFunction.NEGATIVELOGLIKELIHOOD)
.nOut(2)
.activation(Activation.SOFTMAX)
.weightInit(new UniformDistribution(0, 1))
.build())
.build();
注意配置中的 minibatch(false)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.