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
类包含四个核心属性:
-
inputConnection
:神经元间的加权连接 -
inputFunction
:应用于输入数据的权重和向量求和规则 -
transferFunction
:应用于输出数据的权重和向量求和规则 -
output
:经inputFunction
和transferFunction
处理后的输出值
核心行为可表示为:
output = transferFunction(inputFunction(inputConnections));
3.2. 层(Layer)
层本质上是神经元的分组,通常每层神经元仅与前一层和后一层的神经元连接。层通过神经元的加权函数传递信息。
添加神经元到层的示例:
Layer layer = new Layer();
layer.addNeuron(n);
3.3. 神经网络(NeuralNetwork)
顶级父类 NeuralNetwork
包含多个子类,如:
- 卷积神经网络(
ConvolutionalNetwork
) - Hopfield 神经网络(
Hopfield
) - 多层感知机(
MultilayerPerceptron
)
所有神经网络都由层组成,通常分为三类:
- 输入层(input layers)
- 隐藏层(hidden layers)
- 输出层(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());
✅ 神经网络性能取决于:
- 层数
- 每层神经元数量及加权函数
- 训练算法的有效性/数据集准确性
3.4. 训练神经网络
神经网络通过 DataSet
和 LearningRule
训练:
DataSet
:表示训练数据,包含输入大小、输出大小和行数据(DataSetRow
)LearningRule
:指定训练算法(如BackPropagation
、SupervisedLearning
)
创建数据集示例:
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 仓库。