java - DeepLearning4j - 神经网络配置

标签 java neural-network deeplearning4j

在过去的几天里,我开始使用 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;
}

我将非常感谢任何帮助。 问候,

最佳答案

方法一:

这似乎是 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:

我找到了另一种方法来实现这一目标,在某些情况下这可能更理想。

  1. 为数据设置标签名称:

    DataSet verifyData = iterator.next(); List<String> labelNames = new ArrayList<>(); labelNames.add("Label 1"); labelNames.add("Label 2"); verifyData.setLabelNames(labelNames);

  2. 使用预测代替 model.output:

ArrayList<String> labels = (ArrayList<String>) model.predict(verifyData);

关于java - DeepLearning4j - 神经网络配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49391057/

相关文章:

neural-network - 交叉熵误差函数在普通反向传播算法中是如何工作的?

machine-learning - 在 deeplearning4j 中初始化自定义权重

deep-learning - Deeplearning4j 中的时代和迭代

java - Concat over '+' 运算符用于字符串连接

python - 类型错误 : 'numpy.float64' object is not iterable Keras

java - 运行 Spark fpgrowth 示例代码时出现错误

algorithm - 具有批量训练算法的神经网络,何时应用动量和权重衰减

java - 如何将 INDArray 列表存储在文件中

java - Jersey Rest Get 具有特殊特征

Java nio套接字通信位于一台机器或两台机器上的两个进程