簡體   English   中英

用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]]

這看起來像一個老例子。 你是從哪里弄來的? 請注意,該項目不認可或支持人們從中提取的隨機示例。 如果這是來自書中的內容,請注意這些示例在這一點上已有幾年的歷史,不應使用。

這應該是最新的: https://github.com/eclipse/deeplearning4j-examples/blob/master/dl4j-examples/src/main/java/org/deeplearning4j/examples/quickstart/modeling/feedforward/classification/ModelXOR .java

這種配置受到我喜歡稱之為“玩具問題綜合症”的影響。 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM