首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DL4J线性回归

DL4J线性回归
EN

Stack Overflow用户
提问于 2018-01-07 16:29:04
回答 1查看 2.1K关注 0票数 3

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

代码语言:javascript
复制
y = x * 2 + 300

我的愿景

我的结果

参数:

代码语言:javascript
复制
    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. 

网络配置:

代码语言:javascript
复制
    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();
    }

训练数据:

代码语言:javascript
复制
    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);
    }

测试:

代码语言:javascript
复制
    public void test() {

        final MultiLayerNetwork net = new MultiLayerNetwork(createConf());
        net.init();
        net.setListeners(new ScoreIterationListener(1));

        for (int i = 0; i < nEpochs; i++) {
            net.fit(generateTrainingData());
        }

        int idx = 0;
        double x[] = new double[19];
        double y[] = new double[19];
        double p[] = new double[19];
        for (double i = -90; i < 100; i += 10) {
            x[idx] = i;
            y[idx] = y(i);
            p[idx] = scale * net.output(Nd4j.create(new double[]{i / scale, 1})).getDouble(0, 0);
            idx++;
        }
        plot(x, y, p);
    }

请告诉我我做错了什么,或者如果我有错误的视力…

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

EN

回答 1

Stack Overflow用户

发布于 2018-01-07 19:50:42

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

几个小贴士:

使用我们内置的标准化工具。不要自己做这件事。我们的标准化工具也允许您对标签进行标准化。

关闭minibatch (在顶部附近的神经网络配置上设置minibatch(false) )最终您仍然没有真正进行"minibatch学习“

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

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

您的迭代也是错误的。只需将该值保持为1并保持for循环即可。否则,你只是过度适应和花费了比你需要的更多的训练时间。“迭代”实际上是您希望在同一数据集上每次fit调用运行的更新次数。下一个版本,我们无论如何都会摆脱这个选项。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48135551

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档