在过去的几天里,我开始使用deeplearning4j库,我遇到了一个问题。
我的测试和输入数据由25个二进制值组成。训练集包含40行。网络有4个输出值。我的目标是训练网络,使其错误尽可能少。
我已经尝试了不同的配置(也是deeplearning4j示例中提供的配置),但我仍然无法将我的网络配置为具有令人满意的准确性。更重要的是,分类真的很奇怪--例如,网络的输出值是0.31,0.12,0.24,0.33。
在我看来,正确的值应该是0,0,0,1等。
我的神经网络配置:
private static final int SEED = 123;
private static final int ITERATIONS = 1;
private static final int NUMBER_OF_INPUT_NODES = 25;
private static final int NUMBER_OF_OUTPUT_NODES = 4;
private static final int EPOCHS = 10;
public static MultiLayerNetwork getNeuralNetwork() {
StatsStorage storage = configureUI();
MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder().seed(SEED).iterations(ITERATIONS).learningRate(1e-1)
.optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT)
.weightInit(WeightInit.RELU).updater(Updater.ADADELTA).list()
.layer(0, new DenseLayer.Builder().nIn(NUMBER_OF_INPUT_NODES).nOut(60)
.activation(Activation.RELU).build())
.layer(1, new DenseLayer.Builder().nIn(60).nOut(50)
.activation(Activation.RELU).build())
.layer(2, new DenseLayer.Builder().nIn(50).nOut(50)
.activation(Activation.RELU).build())
.layer(3, new OutputLayer.Builder(LossFunctions.LossFunction.MCXENT).nIn(50).nOut(NUMBER_OF_OUTPUT_NODES)
.activation(Activation.SOFTMAX).build()).backprop(true).build();
MultiLayerNetwork network = new MultiLayerNetwork(conf);
network.init();
network.setListeners(new StatsListener(storage), new ScoreIterationListener(1));
DataSetIterator iterator = new ListDataSetIterator(createTrainingSet());
for (int i = 0; i < EPOCHS; i++) {
network.fit(iterator);
}
return network;
}如果有任何帮助,我将非常感激。致以敬意,
发布于 2018-03-21 14:51:47
方法1:
这似乎是SOFTMAX激活的预期行为。这来自PredictGenderTest示例:
INDArray predicted = model.output(features);
//System.out.println("output : " + predicted);
if (predicted.getDouble(0) > predicted.getDouble(1))
gender.setText("Female");
else if (predicted.getDouble(0) < predicted.getDouble(1))
gender.setText("Male");如果你想评估模型,使用下面的模式可能会更容易:
Evaluation eval = new Evaluation(numOutputs);
while(testIter.hasNext()){
DataSet t = testIter.next();
INDArray features = t.getFeatureMatrix();
INDArray labels = t.getLabels();
INDArray predicted = network.output(features, false);
eval.eval(labels, predicted);
}
System.out.println(eval.stats());然后你会得到一个人类可读的结果
方法2:
我已经找到了另一种方法来实现这一点,这在某些情况下可能更可取。
model.output的预测,使用DataSet verifyData = iterator.next(); List<String> labelNames = new ArrayList<>(); labelNames.add("Label 1"); labelNames.add("Label 2"); verifyData.setLabelNames(labelNames);
ArrayList<String> labels = (ArrayList<String>) model.predict(verifyData);
https://stackoverflow.com/questions/49391057
复制相似问题