【发布时间】:2021-10-05 03:57:36
【问题描述】:
我正在尝试在 DL4j 中进行简单的预测(稍后将用于具有 n 个特征的大型数据集),但无论我做什么,我的网络都不想学习并且表现得非常奇怪。当然,我学习了所有教程并执行了 dl4j repo 中显示的相同步骤,但它对我不起作用。
对于我使用的虚拟特征数据:
*double[val][x] 特征;其中 val = linspace(-10,10)...;和 x= Math.sqrt(Math.abs(val)) * val;
我的y是:双[y]标签;其中 y = Math.sin(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);
我的输出看起来很奇怪(见下图),即使我使用 miniBatch(1, 20,100 个样本/批次)更改 epoch 数或添加隐藏节点和隐藏层(尝试添加 1000 个节点和 5 层)。网络要么输出非常随机的值,要么输出一个常数 y。我只是无法识别,这里出了什么问题。为什么网络甚至没有接近 train 函数。
另一个问题:iter.reset() 究竟做了什么。 Iterator 是否将指针转回 DataSetIterator 中的 0-Batch?
【问题讨论】:
-
也许我不得不提一下,我直接从我的 double[][] 和 double[] 数组创建 x_features 和 y_labels,如下所示:
INDArray matrix = Nd4j.create(double[][]);然后创建我的 DataSetIterator这样:DataSet allData = new DataSet(x, y); final List<DataSet> list = allData.asList(); Collections.shuffle(list, rng); return new ListDataSetIterator<>(list, batchSize);
标签: java regression prediction deeplearning4j dl4j