1. 简介

本文将介绍 Neuroph —— 一个用于创建神经网络和实现机器学习的开源库。我们将深入核心概念,并通过多个示例展示如何整合这些组件。

2. Neuroph 概览

Neuroph 提供两种交互方式:

  • 图形化工具(GUI)
  • Java 库

两种方式都基于相同的类层次结构,通过神经元(Neuron)构建人工神经网络。本文聚焦编程实现,但会引用 GUI 工具中的共享类辅助理解。关于 GUI 工具的更多细节,可查阅 Neuroph 官方文档

2.1. 依赖配置

使用 Neuroph 需添加以下 Maven 依赖:

<dependency>
    <groupId>org.beykery</groupId>
    <artifactId>neuroph</artifactId>
    <version>2.92</version>
</dependency>

最新版本可在 Maven Central 查询。

3. 核心类与概念

所有基础概念都有对应的 Java 类实现:

  • 神经元(Neuron) 组成 层(Layer)
  • 层(Layer) 组成 神经网络(NeuralNetwork)
  • 神经网络通过 学习规则(LearningRule)数据集(DataSet) 训练

3.1. 神经元(Neuron)

Neuron 类包含四个核心属性:

  1. inputConnection:神经元间的加权连接
  2. inputFunction:应用于输入数据的权重和向量求和规则
  3. transferFunction:应用于输出数据的权重和向量求和规则
  4. output:经 inputFunctiontransferFunction 处理后的输出值

核心行为可表示为:

output = transferFunction(inputFunction(inputConnections));

3.2. 层(Layer)

层本质上是神经元的分组,通常每层神经元仅与前一层和后一层的神经元连接。层通过神经元的加权函数传递信息。

添加神经元到层的示例:

Layer layer = new Layer(); 
layer.addNeuron(n);

3.3. 神经网络(NeuralNetwork)

顶级父类 NeuralNetwork 包含多个子类,如:

  • 卷积神经网络(ConvolutionalNetwork
  • Hopfield 神经网络Hopfield
  • 多层感知机(MultilayerPerceptron

所有神经网络都由层组成,通常分为三类:

  1. 输入层(input layers)
  2. 隐藏层(hidden layers)
  3. 输出层(output layers)

使用子类构造器(如 Perceptron)可快速创建网络:

NeuralNetwork ann = new Perceptron(2, 4, 1);

手动创建层需注意:

NeuralNetwork ann = new NeuralNetwork();   
Layer layer = new Layer();
ann.addLayer(0, layer);
ann.setInputNeurons(layer.getNeurons());

⚠️ 手动添加的层需用 ConnectionFactory 建立连接:

ann.addLayer(0, inputLayer);    
ann.addLayer(1, hiddenLayerOne); 
ConnectionFactory.fullConnect(ann.getLayerAt(0), ann.getLayerAt(1));

首尾层也需连接:

ConnectionFactory.fullConnect(ann.getLayerAt(0), 
  ann.getLayerAt(ann.getLayersCount() - 1), false);
ann.setOutputNeurons(ann.getLayerAt(
  ann.getLayersCount() - 1).getNeurons());

✅ 神经网络性能取决于:

  1. 层数
  2. 每层神经元数量及加权函数
  3. 训练算法的有效性/数据集准确性

3.4. 训练神经网络

神经网络通过 DataSetLearningRule 训练

  • DataSet:表示训练数据,包含输入大小、输出大小和行数据(DataSetRow
  • LearningRule:指定训练算法(如 BackPropagationSupervisedLearning

创建数据集示例:

int inputSize = 2; 
int outputSize = 1; 
DataSet ds = new DataSet(inputSize, outputSize);

DataSetRow rOne 
  = new DataSetRow(new double[] {0, 0}, new double[] {0});
ds.addRow(rOne);
DataSetRow rTwo 
  = new DataSetRow(new double[] {1, 1}, new double[] {0});
ds.addRow(rTwo);

使用反向传播训练:

NeuralNetwork ann = new NeuralNetwork();
//...
BackPropagation backPropagation = new BackPropagation();
backPropagation.setMaxIterations(1000);
ann.learn(ds, backPropagation);

4. 整合实战

现在通过实际示例整合核心组件。我们将构建典型的 输入层→隐藏层→输出层 架构。

4.1. 构建层

创建 (2, 4, 4, 1) 结构的神经网络:

输入层

Layer inputLayer = new Layer();
inputLayer.addNeuron(new Neuron());
inputLayer.addNeuron(new Neuron());

隐藏层 1

Layer hiddenLayerOne = new Layer();
hiddenLayerOne.addNeuron(new Neuron());
hiddenLayerOne.addNeuron(new Neuron());
hiddenLayerOne.addNeuron(new Neuron());
hiddenLayerOne.addNeuron(new Neuron());

隐藏层 2

Layer hiddenLayerTwo = new Layer(); 
hiddenLayerTwo.addNeuron(new Neuron()); 
hiddenLayerTwo.addNeuron(new Neuron()); 
hiddenLayerTwo.addNeuron(new Neuron()); 
hiddenLayerTwo.addNeuron(new Neuron());

输出层

Layer outputLayer = new Layer();
outputLayer.addNeuron(new Neuron()); 

4.2. 组装神经网络

NeuralNetwork ann = new NeuralNetwork();
ann.addLayer(0, inputLayer);
ann.addLayer(1, hiddenLayerOne);
ConnectionFactory.fullConnect(ann.getLayerAt(0), ann.getLayerAt(1));
ann.addLayer(2, hiddenLayerTwo);
ConnectionFactory.fullConnect(ann.getLayerAt(1), ann.getLayerAt(2));
ann.addLayer(3, outputLayer);
ConnectionFactory.fullConnect(ann.getLayerAt(2), ann.getLayerAt(3));
ConnectionFactory.fullConnect(ann.getLayerAt(0), 
  ann.getLayerAt(ann.getLayersCount()-1), false);
ann.setInputNeurons(inputLayer.getNeurons());
ann.setOutputNeurons(outputLayer.getNeurons());

4.3. 训练准备

创建 XOR(异或)问题的数据集:

int inputSize = 2;
int outputSize = 1;
DataSet ds = new DataSet(inputSize, outputSize);

DataSetRow rOne
  = new DataSetRow(new double[] {0, 1}, new double[] {1});
ds.addRow(rOne);
DataSetRow rTwo
  = new DataSetRow(new double[] {1, 1}, new double[] {0});
ds.addRow(rTwo);
DataSetRow rThree 
  = new DataSetRow(new double[] {0, 0}, new double[] {0});
ds.addRow(rThree);
DataSetRow rFour
  = new DataSetRow(new double[] {1, 0}, new double[] {1});
ds.addRow(rFour);

使用反向传播训练:

BackPropagation backPropagation = new BackPropagation();
backPropagation.setMaxIterations(1000);
ann.learn(ds, backPropagation);

4.4. 测试验证

重要:神经网络输出值范围为 [0,1],其他数据需归一化处理。本例中逻辑值 0/1 无需额外处理。

测试代码:

ann.setInput(0, 1);
ann.calculate();
double[] networkOutputOne = ann.getOutput();

测试结果:

Testing: 1, 0 Expected: 1.0 Result: 1.0
Testing: 0, 1 Expected: 1.0 Result: 1.0
Testing: 1, 1 Expected: 0.0 Result: 0.0
Testing: 0, 0 Expected: 0.0 Result: 0.0

✅ 神经网络成功预测所有 XOR 结果!

5. 总结

本文介绍了 Neuroph 的核心概念和关键类。更多资源可访问 Neuroph 官网,本文示例代码见 GitHub 仓库


原始标题:Introduction to Neuroph