首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >预测函数的DeepLearning4j神经网络不收敛

预测函数的DeepLearning4j神经网络不收敛
EN

Stack Overflow用户
提问于 2021-07-29 13:28:55
回答 1查看 180关注 0票数 0

我试图在DL4j中做一个简单的预测(稍后将它用于具有n个特性的大型数据集),但是不管我做什么,我的网络都不想学习,行为也很奇怪。当然,我学习了所有的教程,并完成了dl4j回购中显示的相同步骤,但不知何故,它并不适用于我。

对于虚拟特性,我使用数据:

*双重特征,其中val =linspace(-10,10).和x= Math.sqrt(Math.abs(val)) * val;

我的y是:doubley标签;其中y= Math.sin( val ) /val

代码语言:javascript
复制
DataSetIterator dataset_train_iter = getTrainingData(x_features, y_outputs_train, batchSize, rnd);
    DataSetIterator dataset_test_iter = getTrainingData(x_features_test, y_outputs_test, batchSize, rnd);

    // Normalize data, including labels (fitLabel=true)
    NormalizerMinMaxScaler normalizer = new NormalizerMinMaxScaler(0, 1);
    normalizer.fitLabel(false);
    normalizer.fit(dataset_train_iter);              
    normalizer.fit(dataset_test_iter);

    // Use the .transform function only if you are working with a small dataset and no iterator
    normalizer.transform(dataset_train_iter.next());
    normalizer.transform(dataset_test_iter.next());

    dataset_train_iter.setPreProcessor(normalizer);
    dataset_test_iter.setPreProcessor(normalizer);

    //DataSet setNormal = dataset.next();

//创建网络

代码语言:javascript
复制
MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder()
                .seed(seed)
                .optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT)
                .weightInit(WeightInit.XAVIER)
                //.miniBatch(true)
                //.l2(1e-4)
                //.activation(Activation.TANH)
                .updater(new Nesterovs(0.1,0.3))
                .list()
                .layer(new DenseLayer.Builder().nIn(numInputs).nOut(20).activation(Activation.TANH)
                        .build())
                .layer(new DenseLayer.Builder().nIn(20).nOut(10).activation(Activation.TANH)
                        .build())
                .layer( new DenseLayer.Builder().nIn(10).nOut(6).activation(Activation.TANH)
                        .build())
                .layer(new OutputLayer.Builder(LossFunctions.LossFunction.MSE)
                        .activation(Activation.IDENTITY)
                        .nIn(6).nOut(1).build())
                .build();

//列车和fit网络

代码语言:javascript
复制
final MultiLayerNetwork net = new MultiLayerNetwork(conf);
net.init();
    net.setListeners(new ScoreIterationListener(100));
    //Train the network on the full data set, and evaluate in periodically
    final INDArray[] networkPredictions = new INDArray[nEpochs / plotFrequency];
    for (int i = 0; i < nEpochs; i++) {
        //in fit we have already Backpropagation. See Release deeplearning
        // https://deeplearning4j.konduit.ai/release-notes/1.0.0-beta3
        net.fit(dataset_train_iter);
        dataset_train_iter.reset();
        if((i+1) % plotFrequency == 0)  networkPredictions[i/ plotFrequency] = net.output(x_features, false);
    }

//评估和绘图

代码语言:javascript
复制
    dataset_test_iter.reset();
    dataset_train_iter.reset();

    INDArray predicted = net.output(dataset_test_iter, false);
    System.out.println("PREDICTED ARRAY                " + predicted);
    INDArray output_train = net.output(dataset_train_iter, false);

    //Revert data back to original values for plotting
    // normalizer.revertLabels(predicted);
    normalizer.revertLabels(output_train);
    normalizer.revertLabels(predicted);

    PlotUtil.plot(om, y_outputs_train, networkPredictions);

然后,我的输出看起来非常奇怪(见下图),即使我使用miniBatch (1,20,100个样本/批处理)更改时间或添加隐藏节点和隐藏层(尝试添加1000个节点和5个层)。网络要么输出非常随机的值,要么输出一个常数y,我只是不知道这里出了什么问题。为什么网络连火车功能都不接近。

另一个问题是: iter.reset()到底做了什么。Iterator是否将指针返回到DataSetIterator中的0批处理?

EN

回答 1

Stack Overflow用户

发布于 2021-07-29 13:52:44

一个很常见的问题是,像这样做玩具问题的人是dl4j假设的小型批次( 99%的问题往往是这样的)。实际上,您并不是在进行小型批处理学习(这实际上违背了实际使用迭代器的意义,迭代器用于遍历数据集的切片,而不是内存中的小数据集)--一个小建议是只使用普通dataset api (这是从dataset.next()返回的内容)。

确保您关闭了dl4j分配给所有损失的小批处理惩罚( .minibatch(false) )--您可以在这里看到该配置:https://github.com/eclipse/deeplearning4j/blob/master/deeplearning4j/deeplearning4j-nn/src/main/java/org/deeplearning4j/nn/conf/NeuralNetConfiguration.java#L434

在这里可以找到测试这种行为的单元测试:https://github.com/eclipse/deeplearning4j/blob/b4047006ac8175df295c2f3c008e7601437ea4dc/deeplearning4j/deeplearning4j-core/src/test/java/org/deeplearning4j/gradientcheck/GradientCheckTests.java#L94

对于后代,以下是相关的配置:

代码语言:javascript
复制
        MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder().miniBatch(false)
                .dataType(DataType.DOUBLE)
                .optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT).updater(new NoOp())
                .list()
                .layer(0,
                        new DenseLayer.Builder().nIn(4).nOut(3)
                                .dist(new NormalDistribution(0, 1))
                                .activation(Activation.TANH)
                                .build())
                .layer(1, new OutputLayer.Builder(LossFunction.MCXENT)
                        .activation(Activation.SOFTMAX).nIn(3).nOut(3).build())
                .build();

您会注意到两件事:1是小批处理是假的,2是数据类型double的配置。我们也欢迎你为你的问题尝试这一点。为了节省内存,Dl4j也倾向于为默认数据类型假定浮动。

这是一个合理的假设,当工作在更大的问题,但可能不是很好的玩具问题。

作为参考,您可以在这里找到小型批处理数学的应用:https://github.com/eclipse/deeplearning4j/blob/fc735d30023981ebbb0fafa55ea9520ec44292e0/deeplearning4j/deeplearning4j-nn/src/main/java/org/deeplearning4j/nn/updater/BaseMultiLayerUpdater.java#L332

这会影响渐变更新。

得分惩罚可以在输出层:https://github.com/eclipse/deeplearning4j/blob/master/deeplearning4j/deeplearning4j-nn/src/main/java/org/deeplearning4j/nn/layers/BaseOutputLayer.java#L84中找到。

本质上,这两种方法都会自动惩罚您的数据集的损失更新,该数据集反映在损失和梯度更新中。

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

https://stackoverflow.com/questions/68576833

复制
相关文章

相似问题

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