Deeplearning4j与R的结果不同

时间:2017-08-10 02:52:59

标签: deeplearning4j

我认为deeplearning4j和R具有完全相同的参数应该执行相同的MSE。但我不确定如何实现这一点。

我有一个csv文件,其格式如下,其中包含46个变量和2个输出。总共有1,0000个样本。所有数据都被标准化,模型用于回归分析。

S1  |  S2  |  ...  |  S46  |  X  |  Y

在R中,我使用neuralnet包,代码为:

rn <- colnames(traindata)
f <- as.formula(paste("X + Y ~", paste(rn[1:(length(rn)-2)], collapse="+")))
nn <- neuralnet(f, 
                rep=1,
                data=traindata, 
                hidden=c(10), 
                linear.output=T,
                threshold = 0.5)

这很简单。

由于我想将算法集成到Java项目中,所以我考虑使用dl4j来训练模型。列车组与R代码完全相同。随机选择测试集。 dl4j代码是:

MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder()
            .seed(rngSeed) //include a random seed for reproducibility
            // use stochastic gradient descent as an optimization algorithm
            .optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT)
            .iterations(100)
            .learningRate(0.0001) //specify the learning rate
            .updater(Updater.NESTEROVS).momentum(0.9) //specify the rate of change of the learning rate.
            .regularization(true).l2(0.0001)
            .list()
            .layer(0, new DenseLayer.Builder() //create the first, input layer with xavier initialization
                    .nIn(46)
                    .nOut(10)
                    .activation(Activation.TANH)
                    .weightInit(WeightInit.XAVIER)
                    .build())
            .layer(1, new OutputLayer.Builder(LossFunctions.LossFunction.MSE) //create hidden layer
                    .nIn(10)
                    .nOut(outputNum)
                    .activation(Activation.IDENTITY)
                    .build())
            .pretrain(false).backprop(true) //use backpropagation to adjust weights
            .build();

纪元数为10,batchsize为128.

使用测试集,R的性能是 enter image description here

并且dl4j的性能如下,我认为它没有发挥其全部潜力。

dl4j的监督者是

由于dl4j中有更多参数,例如updaterregulizationweightInit。所以我认为一些参数没有正确设置。顺便说一下,为什么mornitor图中会有周期性的刺。

任何人都可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

大多数神经网络训练都发生在小型飞机上。 Deeplearning4j假设您默认不会出现玩具问题(内存中的所有数据&lt; 10示例等)

神经网络配置有一个你应该寻找的名为minibatch的函数。

在配置上将minibatch设置为false,您应该得到相同的结果。

如果您想知道为什么会发生这种情况,那就是因为小批量学习不同于在内存中做所有事情。 Minibatch学习自动将梯度除以小批量大小。当你在记忆中做所有事情时,你不会想要那样。

当您进行其他实验时请注意这一点。 有关详细信息,请参阅: https://deeplearning4j.org/toyproblems