四.
[1] 程序说明 本程序是实现一个简单的模式识别的神经网络。用户在画板中用鼠标写字母,由程序进行识别并显示。用户在一个10X12的区域内绘制字母,点击【识别】按钮,对用户输入的图形进行识别。在右上方显示当前的图像所对应的神经网络的输入,在右下方是神经网络的输出和识别结果。在图5中用户输入了A,程序作出了正确的识别。 [2] 用joone-editor建立神经网络模型打开joone-editor,新建一个神经网络,如图所示: 该程序的神经网络的主要组成部分有: l 120个输入节点所组成的输入层 l 由8个节点组成的隐层 l 由4个节点组成的输出层 l 一个joone自己的训练层以及两个文件输入层,用来输入测试数据和期望值。
[3] 训练神经网络 首先通过编写的程序获取训练数据。在java程序的12x10的输入框体中绘制字母,右上角的文本框会生成相应的大小为120的一维整形数组作为输入数据,用分号分隔。每次输入作为单独的一行。由于本程序要区分A、B、C、D四个字母,所以期望值是一个长度为4的数组。现在规定A对应为“1;0;0;0”,B对应“0;1;0;0”,C为“0;0;1;0”,D为“0;0;0;1”,并把这些结果添加到对应的每行输入数据的后面。在两个FileInput中设置输入文件为刚刚建立的数据文件,并设置训练数据是从第1行到第120行,训练数据是从第121行到的124行。 打开控制面板,设置学习速率为0.7,用所用的35条记录训练10000次。点击【run】开始训练。控制面板上会显示训练的进度和收敛情况。到了400次的时候,系统的误差已经很小了(0.002260),可以点击pause来停止训练。如果权值参数选择不合理的话有可能造成网络不能收敛。这时可以选择【control】->【randomize】,重新随机生成初始的权系数。
图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的向量作为输出。
五.测试
绘制了9次A、B、C和8次D共35个记录作为输入数据,训练了10000次,然后输出神经网络。用该神经网络进行识别,发现对于与训练数据相似的输入,识别的准确率很高,但是对和原来的训练数据差别较大的输入,程序可能会发生误判。为了提高准确率,需要增加样本的数量和覆盖面。 六.高级特性
joone还有很多的高级特性。它支持多种处理层(linear, sigmoid, tanh, logarithmic, context , delay, nested),多种连接方式(full synapse,direct synapse,delayed synapse,sanger synapse),还提供了一系列的工具以及script语言来帮助处理数据和分析结果。灵活的运用joone,可以迅速的开发各种神经网络。 七.参考文献及相关资源
[1] 神经网络介绍-利用反向传播算法的模式学习 Andrew Blais, Ph.D. ([email protected]), David Mertz, Ph.D. ([email protected]), Gnosis Software, Inc. 2001 年 6 月 http://www-900.ibm.com/developerWorks/cn/linux/other/l-neural/index.shtml [2] 人工智能 沟口理一郎 石田亨 科学出版社 2003年2月 [3] joone主页 http://sourceforge.net/projects/joone [4] 同时附上本文的java源程序和训练好的神经网络
| 相关文章: 相关软件: |