DL4J线性回归

时间:2018-01-07 08:29:04

标签: neural-network dl4j

我是神经网络的新手。我正在尝试用DL4j实现和训练简单的神经网络。我的功能:

$post_title =  sprintf("%s - %s", $title, $author);

我的愿景 My vision

我的结果 My result

参数:

y = x * 2 + 300

网络配置:

    public final int seed = 12345;
    public final int iterations = 1;
    public final int nEpochs = 1;
    public final int batchSize = 1000;
    public final double learningRate = 0.01;
    public final Random rng = new Random(seed);
    public final int numInputs = 2;
    public final int numOutputs = 1;
    public final double maxX = 100;//xmax = 100; ymax=500. 
    public final double scale = 500;//for scale out x and y. 

培训数据:

    public MultiLayerConfiguration createConf() {
        return new NeuralNetConfiguration.Builder()
                .seed(seed)
                .iterations(iterations)
                .optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT)
                .learningRate(learningRate)
                .weightInit(WeightInit.XAVIER)
                .updater(new Nesterovs(0.9))
                .list()
                .layer(0, new OutputLayer.Builder(LossFunctions.LossFunction.MSE)
                        .activation(Activation.IDENTITY)
                        .nIn(numInputs).nOut(numOutputs).build())
                .pretrain(false).backprop(true).build();
    }

测试:

    public DataSetIterator generateTrainingData() {

        List<DataSet> list = new ArrayList<>();

        for (int i = 0; i < batchSize; i++) {

            double x = rng.nextDouble() * maxX * (rng.nextBoolean() ? 1 : -1);
            double y = y(x);

            list.add(
                    new DataSet(
                            Nd4j.create(new double[]{x / scale, 1}),
                            Nd4j.create(new double[]{y / scale})
                    )
            );
        }

        return new ListDataSetIterator(list, batchSize);
    }

请告诉我我做错了什么或者我的视力不正确......

提前谢谢你, 问候, 米纳斯

1 个答案:

答案 0 :(得分:1)

看看这个例子: https://github.com/deeplearning4j/dl4j-examples/tree/master/dl4j-examples/src/main/java/org/deeplearning4j/examples/feedforward/regression

几点提示:

使用我们内置的规范化工具。不要自己这样做。 我们的规范化工具允许您标准化标签。

关闭minibatch(在靠近顶部的神经网络配置上设置minibatch(false)) 最终你还没有真正做到&#34;小批量学习&#34;

此外,您每次都要重新生成数据集。没有必要这样做。只需创建一次并将其传递给适合。

出于可视化目的,使用我前面提到的恢复机制(在示例中,您可以选择任何一个规范化器中的一个,如MinMaxScalar,NormalizeStandardize,..等)

您的迭代也是错误的。只需将该值保持为1并保持for循环。否则,你只需要过度拟合并花费更多的训练时间。一个&#34;迭代&#34;实际上是您希望在同一数据集上按适合调用运行的更新数。下一个版本我们无论如何都要摆脱那个选项。