简介
NetBeans Platform 是一个通用的 Java Swing 应用程序框架,它提供了一组 GUI 组件和一个模块系统,用于开发自定义桌面应用程序。当然,NetBeans Platform 上最著名的应用程序是 NetBeans IDE,但在 NetBeans Platform 展示中也可以看到许多其他示例。
Neuroph Studio 是一个在 NetBeans Platform 和 Neuroph Framework 上构建的 Java 神经网络开发环境。它是针对神经网络开发定制的类似于 IDE 的环境。Neuroph Studio 是位于 Neuroph Framework 之上的 GUI。Neuroph Framework 是一个功能齐备的 Java 框架,提供用于构建神经网络的各种类。
除了提供易于使用的神经网络向导和工具之外,Neuroph Studio 还集成了 NetBeans IDE 中的基本 Java 开发模块,因此开发人员可以在同一环境中基于神经网络创建、测试和部署各种 Java 组件。以前,开发人员通常需要两个应用程序:一个用于神经网络开发,一个用于 Java 开发。
神经网络属于人工智能(机器学习技术),适用于诸如识别、预测、分类和控制之类的定义不明确的问题。本文将介绍如何创建一些用于分类的 Java 神经网络。注意,Neuroph Studio 还支持图像识别、文本字符识别和手写字母识别,这些功能将在以后的文章中介绍。
注意:如果要安装 Neuroph Studio 和 Neuroph Framework 以尝试本文中介绍的示例,请下载 Neuroph Framework 和 Neuroph Studio(适用于 Microsoft Windows、Linux 或 Mac,具体取决于您系统所运行的操作系统)。
使用 Neuroph Studio 构建神经网络的简要概述
在介绍如何针对实际问题创建和使用神经网络之前,我先简要地说明一下什么是神经网络,并提供一些适用于神经网络工作方式的一般原则。
神经网络是模仿人脑工作方式的计算模型。尽管它们是非常简化的模型,并且基于人脑工作方式的已知原理,但它们展现了一些非常有趣的特性,例如学习、归纳和联想功能。此外,它们还擅长处理噪声数据或不完整数据。
神经网络是图形式结构,包括一组被称作神经元 的互连节点。每个神经元都具有输入端和输出端,通过输入端从其他神经元(连接到其输入端)接收输入,通过输出端将输出发送到其他神经元(连接到其输出端)。神经元的互连方式决定了神经网络架构的类型。
除了神经元之间的连接模式之外,网络行为由神经元内部的处理和所谓的连接权重 决定。连接权重是与神经元之间的连接关联的数值,通过使用相应的算法(称为学习规则)调整这些值,我们可以调整网络行为。
典型的神经元处理包括计算神经元输入和连接权重的加权总和,然后将该值提供给某个函数(通常使用 step、sigmoid 或 tanh 函数)。该函数的输出表示神经元的输出。
无论您要创建常见类型的神经网络还是自定义神经网络,Neuroph Framework 都提供了所有这些现成的神经网络组件。
Neuroph Studio 还提供了一些演示神经网络基本原理的示例。
基本神经元示例
基本神经元示例演示了单个神经元的基本组件和处理。
1. 要打开基本神经元示例,在 Neuroph Studio 中选择 File > New Project > Samples > Neuroph > Basic Neuron Sample。
图 1. 创建基本神经元示例新项目
这个基本神经元模型包括以下组件:
- 两个输入 x1 和 x2 以及对应的权重 w1 和 w2。
- 一个输入函数,它使用以下公式计算加权总和:
s = (x1*w1) + (x2*w2)
。 - 一个传递函数,它将加权总和作为输入,使用简单的 step 函数计算神经元的输出。如果加权总和大于零,则函数输出 1;否则,输出 0。
图 2. 基本神经元示例
2. 通过更改输入和权重值尝试运行该示例并使用神经元,然后单击 Calculate output 按钮。
在学习过程中,自动调整神经元的权重以实现期望的行为。这是人工神经元工作的基本原理,但根据神经网络类型的不同还有许多变化。
多层感知器 (MLP) 网络是一种常用于多种不同类型问题的神经网络类型。该网络包括数层神经元(至少三层),其中一层中的每个神经元都连接到下一层中的每个神经元。用于该类型网络的常见传递函数是所谓的 sigmoid 函数。图 3 中显示了该类型网络的架构。
图 3. 多层感知器网络架构
此类型的网络可用于各种机器学习任务,例如识别、预测、估算等。Neuroph Studio 提供了一个展示多层感知器网络如何用于分类问题的示例。
多层感知器分类示例
该示例显示如何使用多层感知器网络学习复杂的分类任务。
1. 要运行该示例,在 Neuroph Studio 中选择 File > New Project > Samples > Neuroph > Multi Layer Perceptron Classification Sample,如图 4 中所示。
图 4. 多层感知器网络示例
2. 通过单击特性空间 (x1, x2) 创建一个分类任务。
单击左键将创建红点,单击右键将创建蓝点。每个点表示一个具有两个特性(x1 和 x2)的项。
这些项表示神经网络应该以这样一种方式学习的数据:对于给定输入(x1 和 x2),该方式可以确定输入属于蓝色类还是红色类。
图 5. 多层感知器网络示例的数据
输入特性的数量对应于神经网络中输入神经元的数量,而分类类的数量通常对应于输出神经元。在该示例中,由于我们只有两个类,因此我们仅使用一个输出神经元,它针对蓝色类输出 0,针对红色类输出 1。
我们还需要设置隐藏神经元(以及层)的数量,这取决于分类的复杂程度。隐藏神经元是指输入层和输出层之间的神经元,MLP 网络可以有一个或多个隐藏层。
3. 在对应的域中,输入隐藏层中的神经元数量。数字之间用空格分隔。
对于这个简单示例,五个隐藏神经元足够了。
除了隐藏神经元的数量,我们还可以设置一些学习参数,例如 Learning Rate、Momentum、Max Error 以及 Max Iterations,这些参数是用于反向传播(MLP 的学习算法)的典型设置。
就现在来说,保留这些参数的默认值,但记住,对于不同的问题,某些其他值可能会产生更好的结果。这些值始终在 [0, 1] 范围内。
4. 单击 Train 按钮。
将创建神经网络并启动学习过程。稍后,您可以在 Multi Layer Perceptron Classification Sample 选项卡中看到结果,如图 6 中所示。
图 6. 多层感知器网络示例的结果
图 6 显示了神经网络如何查看给定数据以及如何解释提供给神经网络的任何其他数据。
我们还可以通过查看 Total Network Error Graph 选项卡查看网络如何学习给定数据。该图(如图 7 中所示)显示了学习规则如何调整网络权重以尽量减少错误分类(网络错误)。
图 7. Total Network Error Graph 选项卡
我们还可以在 MlpSampleNet1 选项卡中查看神经网络本身,如图 8 中所示。
图 8. MlpSampleNet1 选项卡中显示的神经网络
注意,在该图中,输入层中有三个神经元,隐藏层中有六个神经元。两个层中都有的一个神经元是偏差神经元,它始终输出 1。偏差神经元提供其他内部输入。
上面的示例是可能实现的最简单示例,我们不需要针对它使用神经网络。但是,我们使用该示例只是为了介绍使用神经网络时的基本原理。神经网络实际上可以执行复杂的分类,如图 9 中所示的分类。
图 9. 复杂分类示例
您可以体验不同的分类问题和学习设置,以了解神经网络如何工作。
训练神经网络之后,可以通过单击 Neuroph Studio 中的 Save 按钮将该网络序列化为一个 Java 类。然后,可以使用 Neuroph Framework 将其部署到应用程序中。下面是示例代码:
// load serialized network from file NeuralNetwork nnet = NeuralNetwork.load("MySavedNeuralNetwork.nnet"); // set network input which we want to classify nnet.setInput(0.5, 0.9); // process input/calculate network nnet.calculate(); // get networkoutput/classification result double[] output = nnet.getOutput();
注意:您可以创建一个 Java 项目,然后直接从 Neuroph Studio 运行该代码,但您需要在项目中引用 neuroph-2.5.jar 文件以便能够使用该代码。该 jar 文件是一个 Neuroph Framework 类库,该文件以及完整的 Neuroph Framework 文档和源代码可通过下载 neuroph-2.5b.zip 文件获得。
创建和训练自定义神经网络
前面的示例是使用 Neuroph Studio 的分类示例创建的。但是,您可以使用向导轻松创建和训练自定义神经网络。要创建神经网络并向该网络传授分类问题,可以执行以下任务:
- 创建一个新的 Neuroph Studio 项目。
- 使用 New Neural Network Wizard 创建一个神经网络。
- 使用 New Training Set Wizard 创建一个训练集。
- 使用创建的训练集训练神经网络。
下面是具体步骤。
1. 首先,通过选择 File > New Project > Neuroph > Neuroph Project 创建一个新的 Neuroph Studio 项目。
图 10. 创建新的 Neural Studio 项目
2. 输入项目名称,然后单击 Finish。
图 11. 指定项目名称
3. 通过选择 File > New File > Neuroph > Neural Network 创建一个多层感知器神经网络。
图 12. 创建多层感知器网络
4. 将神经网络类型设置为 Multilayer Perceptron 并输入网络名称。
图 13. 设置网络类型
系统将要求您设置网络参数。
5. 输入图 14 中所示的网络参数值,然后单击 Finish。
图 14. 设置网络参数
这将创建神经网络,如图 15 所示。
图 15. 创建了神经网络
6. 通过选择 File > New File > Neuroph > Training Set 创建训练集。
图 16. 创建训练集
7. 指定训练集设置,如图 17 所示。
对于该示例,我们将使用 Iris 分类数据集,这是众所周知的分类问题数据集。
简而言之,我们具有鸢尾花的四个属性和三个类,并且分类有点棘手。有关更多详细信息,请参阅此 Wikipedia 文章。注意,属性的数量对应于网络输入的数量,输出的数量对应于分类类。
图 17. 指定训练集设置
8. 从此标准化文件中导入 Iris 数据集,使用制表符分隔值 (TSV)。
在此我们使用标准化的数据集,这只是意味着将原始值缩放到 [0, 1] 区间。
图 18. 导入 Iris 数据集
训练集将如下所示:
图 19. 示例训练集
9. 要训练网络,单击神经网络将其打开,从训练集列表中选择 Iris 训练集,然后单击 Train 按钮。
10. 使用 Set Learning Parameters 对话框中的默认学习参数,然后单击 Train 按钮。
图 20. 使用默认学习参数
在 Total Network Error Graph 选项卡中,您可以观察到在学习过程中如何使网络错误逐渐减至最少。
图 21. Total Network Error Graph 选项卡
总结
本文介绍了如何使用 Neuroph Studio 以及 Neuroph Framework 轻松创建 Java 神经网络。本文并未介绍有关神经网络理论和实践的更多详细信息,但在另请参见一节中提供了几个参考资源。
具有集成的神经网络和 Java 开发环境将非常方便,而 Neuroph Studio 是第一个提供此类环境的应用程序。由于 Neuroph Studio 是开源的,因此它非常适于教育和研究,而且它对于要使用神经网络作为其项目一部分的 Java 开发人员也很有帮助。
另请参见
- Neuroph 下载页面
- Neuroph 主页
- NetBeans Platform 页面
- Iris 分类问题(Wikipedia 文章)
- 伯明翰大学的神经网络课程
- 威拉姆特大学的神经网络课程
- 人工神经网络 — 神经网络教程
- 神经网络常见问题解答
关于作者
Zoran Sevarac 是贝尔格莱德大学软件工程系的助教,并且是贝尔格莱德大学人工智能实验室的研究员。他还是 GOAI Research Network 的成员。在其研究期间中,他一直致力于开发 Java 神经网络框架,该框架已作为开源项目 Neuroph 发布。他拥有信息系统专业硕士学位,目前正在攻读博士学位。他还是当地 NetBeans 社区 NetBeans User Group Serbia 的创始人。