Java 深度学习4J-3层神经网络拟合不正确

Java 深度学习4J-3层神经网络拟合不正确,java,machine-learning,data-science,deeplearning4j,Java,Machine Learning,Data Science,Deeplearning4j,我正在努力学习Deeplearning4j图书馆。我正在尝试实现一个简单的三层神经网络,使用sigmoid激活函数来求解XOR。我缺少哪些配置或超参数?我在网上找到的一些MLP示例中,使用RELU激活和softmax输出,成功地获得了准确的输出,但是使用sigmoid激活,它似乎不希望精确匹配。有人能告诉我为什么我的网络不能产生正确的输出吗 DenseLayer inputLayer = new DenseLayer.Builder() .nIn(2)

我正在努力学习Deeplearning4j图书馆。我正在尝试实现一个简单的三层神经网络,使用sigmoid激活函数来求解XOR。我缺少哪些配置或超参数?我在网上找到的一些MLP示例中,使用RELU激活和softmax输出,成功地获得了准确的输出,但是使用sigmoid激活,它似乎不希望精确匹配。有人能告诉我为什么我的网络不能产生正确的输出吗

    DenseLayer inputLayer = new DenseLayer.Builder()
            .nIn(2)
            .nOut(3)
            .name("Input")
            .weightInit(WeightInit.ZERO)
            .build();

    DenseLayer hiddenLayer = new DenseLayer.Builder()
            .nIn(3)
            .nOut(3)
            .name("Hidden")
            .activation(Activation.SIGMOID)
            .weightInit(WeightInit.ZERO)
            .build();

    OutputLayer outputLayer = new OutputLayer.Builder()
            .nIn(3)
            .nOut(1)
            .name("Output")
            .activation(Activation.SIGMOID)
            .weightInit(WeightInit.ZERO)
            .lossFunction(LossFunction.MEAN_SQUARED_LOGARITHMIC_ERROR)
            .build();

    NeuralNetConfiguration.Builder nncBuilder = new NeuralNetConfiguration.Builder();
    nncBuilder.iterations(10000);
    nncBuilder.learningRate(0.01);
    nncBuilder.optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT);

    NeuralNetConfiguration.ListBuilder listBuilder = nncBuilder.list();
    listBuilder.layer(0, inputLayer);
    listBuilder.layer(1, hiddenLayer);
    listBuilder.layer(2, outputLayer);

    listBuilder.backprop(true);

    MultiLayerNetwork myNetwork = new MultiLayerNetwork(listBuilder.build());
    myNetwork.init();

    INDArray trainingInputs = Nd4j.zeros(4, inputLayer.getNIn());
    INDArray trainingOutputs = Nd4j.zeros(4, outputLayer.getNOut());

    // If 0,0 show 0
    trainingInputs.putScalar(new int[]{0,0}, 0);
    trainingInputs.putScalar(new int[]{0,1}, 0);
    trainingOutputs.putScalar(new int[]{0,0}, 0);

    // If 0,1 show 1
    trainingInputs.putScalar(new int[]{1,0}, 0);
    trainingInputs.putScalar(new int[]{1,1}, 1);
    trainingOutputs.putScalar(new int[]{1,0}, 1);

    // If 1,0 show 1
    trainingInputs.putScalar(new int[]{2,0}, 1);
    trainingInputs.putScalar(new int[]{2,1}, 0);
    trainingOutputs.putScalar(new int[]{2,0}, 1);

    // If 1,1 show 0
    trainingInputs.putScalar(new int[]{3,0}, 1);
    trainingInputs.putScalar(new int[]{3,1}, 1);
    trainingOutputs.putScalar(new int[]{3,0}, 0);

    DataSet myData = new DataSet(trainingInputs, trainingOutputs);
    myNetwork.fit(myData);


    INDArray actualInput = Nd4j.zeros(1,2);
    actualInput.putScalar(new int[]{0,0}, 0);
    actualInput.putScalar(new int[]{0,1}, 0);

    INDArray actualOutput = myNetwork.output(actualInput);
    System.out.println("myNetwork Output " + actualOutput);
    //Output is producing 1.00. Should be 0.0

因此,一般来说,我将把您链接到:

一些具体的建议。永远不要使用weight init zero,在我们的示例中不使用它是有原因的,我强烈建议您从零开始,而不是从头开始:

对于输出层,如果要学习xor,为什么不直接使用二进制xent:

这里需要注意的是,也要关闭小批量。请参见上面的示例,请参见:
边上的建议,我们有一个频道,你可以在网站上得到现场帮助。理由是,你似乎只是在随机探索,我也会考虑得到奥利利书:Soo.Orry.Co /Studio/06369353534。非常感谢您的帮助和良好的信息!非常感谢!