基于 JOONE 快速开发神经网络 (Java)

基于 JOONE 快速开发神经网络  

一. 神经网络介绍

20 世纪 70 年代以来,随着计算机技术的不断发展,人工神经网络( ANN )的理论与实践都得到了迅猛提高。 ANN 的概念来源于生物神经网络( BNN )。限于目前的理论与技术, ANN 保留了脑神经网络的基本结构,反映脑神经系统的工作原理。在 ANN 中,记忆的信息存贮在连接权上,外部刺激通过连接通道自动激活相应的神经元,以达到自动识别的目的。因而,它是与现代计算机完全不同的系统。 ANN 模拟生物体中神经网络的某些结构和功能,并反过来用于工程或其他的领域。

 

二. 关于 JOONE

JOONE( Java Object Oriented Neural Network )sourceforge.net 上一个用 java 语言迅速开发神经网络的开源项目。 JOONE 支持很多的特性,比如多线程和分布式计算,这意味着可以 JOONE 可以利用多处理器或是多计算机来均衡附载。

JOONE 主要有三个大的模块:

joone-enginejoone 的核心模块。

                                          joone-editorjoonegui 开发环境。不用编写一行代码就建立神经网络模型,并可以进行训练和验证。 Joone 中提供了一个用 joone-editor 建立 xor 网络模型的例子,本文中的神经网络就是参考这个例子所完成的。

joone-distributed-environment        joone 用于支持分布式计算的模块。

本文使用 joone-editor 建立一个用于模式识别的神经网络,进行训练,然后在一个 java applet 程序中用于识别用户的输入。

 

三. 利用 JOONE 快速建立神经网络

 

 

 

 

 

 

 

图1.一个简单的神经网络

 

2.在joone中的表示

 

 

    图 1 是一个简单的神经网络,在 joone 中用 layer 来表示每层的所有的节点,用 synapse 来封装层与层之间的连接。这是相应的 java 代码:

// 建立三个 sigmoid 节点层和两个全连接。

SigmoidLayer layer1 = new SigmoidLayer();

SigmoidLayer layer2 = new SigmoidLayer();

SigmoidLayer layer3 = new SygmoidLayer();

FullSynapse synapse1 = new FullSynapse();

FullSynapse synapse2 = new FullSynapse();

// 设置各层的节点个数

layer1.setRows(3);

layer2.setRows(3);

layer3.setRows(3);

// 把各层连接起来

layer1.addOutputSynapse(synapse1);

layer2.addInputSynapse(synapse1);

layer2.addOutputSynapse(synapse2);

layer3.addInputSynapse(synapse2);

 

这样,一个简单的神经网络模型就建好了, joone 会自动的随机设置连接的权系数。 当然这个网络目前还没有进行训练,没有任何实际的功能。下文将用 joone 建立一个模式识别的神经网络。也可以用 joone-editor 在可视化界面上快速建立神经网络,下图是用 joone-editor 建立的求解异或问题的神经网络模型:

 

4.joone-editor中的模型

四.

 

5.识别程序

建立模式识别的神经网络

[1]        程序说明

本程序是实现一个简单的模式识别的神经网络。用户在画板中用鼠标写字母,由程序进行识别并显示。用户在一个 10X12 的区域内绘制字母 , 点击【识别】按钮,对用户输入的图形进行识别。在右上方显示当前的图像所对应的神经网络的输入,在右下方是神经网络的输出和识别结果。在图 5 中用户输入了 A ,程序作出了正确的识别。

 

[2]        joone-editor 建立神经网络模型

打开 joone-editor ,新建一个神经网络,如图所示:

该程序的神经网络的主要组成部分有:

l           120 个输入节点所组成的输入层

l           8 个节点组成的隐层

l           4 个节点组成的输出层

l           一个 joone 自己的训练层以及两个文件输入层,用来输入测试数据和期望值。

 

 

 

 

 

[3]        训练神经网络

首先通过编写的程序获取训练数据。在 java 程序的 12x10 的输入框体中绘制字母,右上角的文本框会生成相应的大小为 120 的一维整形数组作为输入数据,用分号分隔。每次输入作为单独的一行。由于本程序要区分 ABCD 四个字母,所以期望值是一个长度为 4 的数组。现在规定 A 对应为“ 1;0;0;0 ”, B 对应“ 0;1;0;0 ”, C 为“ 0010 ”, D 为“ 0001 ”,并把这些结果添加到对应的每行输入数据的后面。在两个 FileInput 中设置输入文件为刚刚建立的数据文件,并设置训练数据是从第 1 行到第 120 行,训练数据是从第 121 行到的 124 行。

打开控制面板,设置学习速率为 0.7, 用所用的 35 条记录训练 10000 次。点击【 run 】开始训练。控制面板上会显示训练的进度和收敛情况。到了 400 次的时候,系统的误差已经很小了( 0.002260 ),可以点击 pause 来停止训练。如果权值参数选择不合理的话有可能造成网络不能收敛。这时可以选择【 control 】- >randomize 】,重新随机生成初始的权系数。

 

7.训练控制面板

7.训练控制面板

[4]        把完成训练的神经网络移植到程序中

为了在程序中使用训练好的神经网络,可以把利用 java 的序列化功能把完成训练的网络输出到文件中,然后在程序中读取这个文件,重新生成神经网络对象。选择【 file 】- >export neuralNet… 】,把当前神经网络保存到文件中去。然后就可以在程序中使用了。

下面是从文件中读取神经网络的代码:

ObjectInputStream ois = new ObjectInputStream( new  FileInputStream( "D:/work/homework/ANN/final/3.snet" ));

Object o = ois.readObject();

System.out.println( "o is " + o);

ois.close();

NeuralNet net = (NeuralNet) o;

然后在程序中就可以使用了。每次用户绘制的数据转换成 120 的一维数组作为输入,然后神经网络进行计算并输出一个长为 4 的向量作为输出。

 

五. 测试

绘制了 9ABC8D35 个记录作为输入数据,训练了 10000 次,然后输出神经网络。用该神经网络进行识别,发现对于与训练数据相似的输入,识别的准确率很高,但是对和原来的训练数据差别较大的输入,程序可能会发生误判。为了提高准确率,需要增加样本的数量和覆盖面。

 

六. 高级特性

joone 还有很多的高级特性。它支持多种处理层( linear, sigmoid, tanh, logarithmic, context , delay, nested ),多种连接方式( full synapse,direct synapse,delayed synapse,sanger synapse ),还提供了一系列的工具以及 script 语言来帮助处理数据和分析结果。灵活的运用 joone ,可以迅速的开发各种神经网络。

 

七. 参考文献及相关资源

[1]        神经网络介绍-利用反向传播算法的模式学习 Andrew Blais, Ph.D. (onlymice@gnosis.cx), David Mertz, Ph.D. (mertz@gnosis.cx), Gnosis Software, Inc. 2001 6 http://www-900.ibm.com/developerWorks/cn/linux/other/l-neural/index.shtml

[2]        人工智能 沟口理一郎 石田亨 科学出版社 20032

[3]        joone 主页 http://sourceforge.net/projects/joone

[4]        同时附上本文的 java 源程序和训练好的神经网络

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java开源项目JOONE是一个基于Java神经网络框架,可以用来实现人工智能编程。下面是一个使用JOONE实现人工智能的例子: 假设我们要实现一个简单的人工智能程序,该程序能够识别手写数字。我们可以使用JOONE来训练一个神经网络,让它学会如何识别手写数字。 首先,我们需要准备一些手写数字的数据集。这些数据集可以是一个包含手写数字图像和对应标签的数据集。我们可以使用MNIST数据集,它是一个广泛使用的手写数字数据集。 接下来,我们需要使用JOONE构建一个神经网络,该网络将接受手写数字图像作为输入,输出该数字的标签。我们可以使用JOONE神经网络模块来构建网络,例如: ``` NeuralNet nn = new NeuralNet(); Layer inputLayer = new InputLayer(); Layer hiddenLayer = new SigmoidLayer(); Layer outputLayer = new OutputLayer(); nn.addLayer(inputLayer); nn.addLayer(hiddenLayer); nn.addLayer(outputLayer); FullSynapse synapseIH = new FullSynapse(); FullSynapse synapseHO = new FullSynapse(); synapseIH.setInputLayer(inputLayer); synapseIH.setOutputLayer(hiddenLayer); synapseHO.setInputLayer(hiddenLayer); synapseHO.setOutputLayer(outputLayer); nn.addSynapse(synapseIH); nn.addSynapse(synapseHO); ``` 以上代码创建了一个包含一个输入层、一个隐藏层和一个输出层的神经网络。输入层接受手写数字图像,输出层输出该数字的标签。隐藏层使用Sigmoid函数作为激活函数。 接下来,我们需要使用JOONE的训练模块来训练神经网络。我们可以使用反向传播算法来训练网络,例如: ``` BackpropagationTrainer trainer = new BackpropagationTrainer(); trainer.setNeuralNet(nn); trainer.setTrainingPatterns(trainingPatterns); trainer.train(); ``` 以上代码使用训练模式来训练神经网络。训练模式包含一组输入和对应的输出标签,用于训练神经网络。训练模式可以从MNIST数据集中生成。 最后,我们可以使用训练好的神经网络来识别手写数字。例如: ``` double[] input = new double[784]; //将手写数字图像转换为一维数组,作为神经网络的输入 nn.setInput(input); //获取神经网络的输出,即识别出的手写数字标签 double[] output = nn.getOutput(); ``` 以上代码将手写数字图像转换为一维数组,作为神经网络的输入。然后获取神经网络的输出,即识别出的手写数字标签。 通过以上步骤,我们就可以使用JOONE来实现一个简单的手写数字识别人工智能程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值