当前位置: 首页 > 知识库问答 >
问题:

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

冀望
2023-03-14

我试图在DL4j中做一个简单的预测(稍后将用于具有n个特性的大型数据集),但无论我做什么,我的网络都不想学习,行为非常奇怪。当然,我学习了所有的教程,并执行了dl4j repo中显示的相同步骤,但不知何故,它对我不起作用。

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

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

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();
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();
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);
    }
    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);

共有1个答案

葛兴发
2023-03-14

一个很常见的问题是人们在做玩具问题,比如DL4J的小批量假设(99%的问题都是这样)。您实际上并不是在进行minibatch学习(这实际上违背了实际使用迭代器的观点,迭代器的目的是遍历数据集的切片,而不是内存中的小型数据集)--一个小的建议是只使用普通的数据集api(它是从dataset.next()返回的)

使用:.minibatch(false)确保关闭dl4j分配给所有损失的minibatch惩罚-您可以在以下位置看到该配置: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


        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();
 类似资料:
  • 在过去的几天里,我开始使用deeplearning4j库,我遇到了一个问题。 我的测试和输入数据由25个二进制值组成。训练集包含40行。网络有4个输出值。我的目标是训练网络有尽可能少的错误。 我的神经网络配置: 我会非常感激任何帮助。问候,

  • 在过去的两周里,我读了很多关于NN的文章,我想我在网上看到了几乎所有的“XOR”方法教程。但是,我无法使工作成为我自己的工作。我从一个简单的“OR”神经元方法开始。给出良好的结果。我认为我的问题是反向传播的实现。我做了一个对象方法,所以这里是主线。 三类: 神经元 前馈层(包含神经元) 前馈网络(包含前馈层) 所以我通过给网络赋予异或表xor表的历元来训练网络 网络将在千历元后输出约0.5…有趣的

  • 我一直在看一些关于深度学习/卷积神经网络的视频,比如这里和这里,我试图用C语言实现我自己的。在我第一次尝试时,我试图保持输入数据相当简单,所以我的想法是区分十字和圆,我有一个大约25个的小数据集(64*64个图像),它们如下所示: 网络本身有五层: 我的问题是我的网络没有收敛到任何东西上。权重似乎都没有改变。如果我运行它,预测基本保持不变,除了偶尔出现的异常值,它会在下一次迭代返回之前跳起来。 卷

  • 我正在学习神经网络,并在python中实现它。我首先定义了一个 softmax 函数,我遵循这个问题给出的解决方案 Softmax 函数 - python。以下是我的代码: 我得到了一个测试代码,看看函数是否正确。是测试数据,

  • 本文向大家介绍问题:神经网络激活函数?相关面试题,主要包含被问及问题:神经网络激活函数?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: sigmod、tanh、relu 解析:需要掌握函数图像,特点,互相比较,优缺点以及改进方法

  • 神经网络 (Neural Network) 是机器学习的一个分支,全称人工神经网络(Artificial Neural Network,缩写 ANN),是一种模仿生物神经网络的结构和功能的数学模型或计算模型,用于对函数进行估计或近似。 Perceptron (感知器) 一个典型的神经网络由输入层、一个或多个隐藏层以及输出层组成,其中箭头代表着数据流动的方向,而圆圈代表激活函数(最常用的激活函数为