- 浏览: 68330 次
- 性别:
- 来自: 郑州
文章分类
最新评论
用Java开源项目JOONE实现人工智能编程
很少有程序员不对这里或者那里所包含的人工智能编程所吸引,然而,许多对AI感兴趣的程序员很快就因其中包含的算法的复杂性而退却。在本文中,我们将讨论一个能大大简化这种复杂性的Java开源工程。
Java面向对象的神经网络(JOONE)是一开源工程,它提供给Java程序员一个高适应性的神经网络。该JOONE工程源代码由LGPL所保护。简言之,这意味着源代码是可自由使用的而且你不需要支付版税就可以使用JOONE。JOONE可以从http://joone.sourceforge.net/处下载。
JOONE能允许你轻易地从一个Java程序中创建神经网络。JOONE支持许多特征,如多线程和分布式处理。这意味着JOONE能利用多处理机计算机和多台计算机的优势来进行分布式处理。
神经网络
JOONE用Java实现了一个人工神经网络。一个人工神经网络试图仿效生物学神经网络的功能--神经网络组成今天在地球上几乎所有高等生命的大脑形式。神经网络由神经原组成。
从图1中你可以看出,神经原由一个内核细胞和几个长长的称为触角的连接器组成。神经原之间依靠这些触角进行连接。无论是生物学的还是人工的神经网络,都通过触角把信号从一个神经原传递到另一个神经原来工作。
使用JOONE
在这篇文章中,你将看到一个简单的怎样使用JOONE的实例。神经网络题目涉及广泛并覆盖许多不同的应用领域。在本文中,我们将展示给你怎样使用JOONE来解决一个很简单的模式识别问题。模式识别是神经网络中的最普遍的应用之一。
模式识别提供给神经网络一种模式,判断是否该神经网络能够识别出该模式。这种模式应该能够在某种程度上被扭曲而该神经网络仍然能够识别它。这很像人类识别东西(如一个交通标志)的能力。人类应该能够识别在下雨天,晴天或者晚上的交通标志。即使这些图像看上去可能相当不同,但人类的大脑仍能够判断出它们是一样的图像。
当进行JOONE编程时,你一般要使用两种类型的对象。你要使用神经原层对象,用于描述一层的一个或多个的具有相似特征的神经原。神经网络经常有一层或两层神经元。这些神经元层通过触角联系在一起。这些触角把这种待识别的模式,从一个神经元层传输到另一个神经元层。
触角不仅把这种模式从一个神经元层传输到另一个神经元层。触角还将生成一些指向这种模式的元素的斜线。这些斜线将导致这种模式的某些元素在被传输到下一个神经元层时不如通过其它方式传递更有效些。这些斜线通常称为权重,它们形成神经网络的存储系统。通过调整存储在触角中的这些权重,可以更改神经网络的行为。
触角在JOONE中还承担着另外一个角色。在JOONE中,可以把触角看作是数据导管。正如触角把模式从一个神经元层传输到另一个神经元层,指定版本的触角用于把模式传入和传出神经网络。下面将给你展示一个简单的单层的神经网络是怎样被构建并进行模式识别的。
训练神经网络
为实现本文的目的,我们将指导JOONE去识别一个很简单的模式。在这种模式中,我们将考察一个二进制的布尔操作,例如XOR。这个XOR操作的真值表列举如下:
X Y X XOR Y
0 0 0
0 1 1
1 0 1
1 1 0
正如你从上表中看到的,XOR运算的结果是只有当X和Y具有不同值时,结果才为真(1)。其它情况下,XOR运算结果均为假(0)。默认地,JOONE从存储在你的系统中的文本文件中取得输入。这些文本文件通过使用一种称为FileInputSynapse的特殊触角来读取。为了训练XOR运算问题,你必须建立一个输入文件-该文件包含上面显示的数据。该文件显示在列表1中。
列表1:为解决XOR问题的输入文件的内容
0.0;0.0;0.0
0.0;1.0;1.0
1.0;0.0;1.0
1.0;1.0;0.0
我们现在分析一个简单的程序,它指导JOONE来识别XOR运算并产生正确的结果。我们现在分析训练该神经网络必须被处理的过程。训练过程包括把XOR问题提交给神经网络,然后观察结果。如果这个结果不是所预期的,该训练算法将调整存储在触角中的重量。在神经网络的实际输出和预料的输出之间的差距称为误差。训练将继续到误差小于一个可接受值为止。这个级别通常是一个百分数,如10%。我们现在分析必须用于训练一个神经网络的代码。
训练过程通过建立神经网络开始,同时也必须创建隐蔽的输入层和输出层。
// 首先,创造这三个层
input = new SigmoidLayer();
hidden = new SigmoidLayer();
output = new SigmoidLayer();
每个层被使用JOONE对象SigmoidLayer创建。Sigmoidlayer基于自然对数生成一个输出。JOONE还包含另外的层,而不是你可能选择使用的S形的层类型。
下一步,每一层被赋于一个名字。这些名字将有助于后面在调试期间识别该层。
input.setLayerName("input");
hidden.setLayerName("hidden");
output.setLayerName("output");
现在必须定义每个层。我们将指定在每一层中的"行"号。该"行"号对应于这一层中的神经原的数目。
input.setRows(2);
hidden.setRows(3);
output.setRows(1);
从上面的代码看出,输入层有两个神经原,隐蔽层有三个隐蔽神经原,输出层包含一个神经原。这对于神经网络包含两个输入神经原和一个输出神经原是具有重要意义的,因为XOR运算符接收两个参数而产生一个结果。
为使用该神经原层,我们也必须创建触角。在本例中,我们要使用多个触角。这些触角用下面的代码实现。
// 输入-> 隐蔽的连接。
FullSynapse synapse_IH = new FullSynapse();
// 隐蔽-> 输出连接。
FullSynapse synapse_HO = new FullSynapse();
就象神经原层的情况一样,触角也可能命名以有助于程序的调试。下面的代码命名新建的触角。
synapse_IH.setName("IH");
synapse_HO.setName("HO");
最后,我们必须把触角联接到适当神经原层。下面的代码实现这一点。
// 联接输入层到隐蔽层
input.addOutputSynapse(synapse_IH);
hidden.addInputSynapse(synapse_IH);
// 联接隐蔽层到输出层
hidden.addOutputSynapse(synapse_HO);
output.addInputSynapse(synapse_HO);
现在既然神经网络已被创建,我们必须创建一个用于调节该神经网络的监视器对象。下面的代码创建监视器对象。
//创建监视器对象并且设置学习参数
monitor = new Monitor();
monitor.setLearningRate(0.8);
monitor.setMomentum(0.3);
学习速度和动力作为参数以用于指定训练的产生方式。JOONE利用backpropagation学习算法。要更多了解关于学习速度或者动力的信息,你应该参考backpropagation算法。
这个监视器对象应该被赋值给每一个神经原层。下面的代码实现这一点。
input.setMonitor(monitor);
hidden.setMonitor(monitor);
output.setMonitor(monitor);
就象许多Java对象本身一样,JOONE监视器允许听者可以添加到它上面去。随着训练的进行,JOONE将通知听者有关训练进程的信息。在这个简单的例子中,我们使用:
monitor.addNeuralNetListener(this);
我们现在必须建立输入触角。如前所述,我们将使用一个FileInputSynapse来读取一个磁盘文件。磁盘文件不是JOONE唯一能够接受的输入种类。JOONE对于不同的输入源具有很强的灵活性。为使JOONE能够接收其它输入类型,你只需创建一个新的触角来接受输入。在本例中,我们将简单地使用FileInputSynapse。FileInputSynapse首先被实例化。
inputStream = new FileInputSynapse();
然后,必须通知FileInputSynapse要使用哪些列。列表1中显示的文件使用了输入数据的前两列。下面代码建立起前两列用于输入到神经网络。
// 前两列包含输入值
inputStream.setFirstCol(1);
inputStream.setLastCol(2);
然后,我们必须提供输入文件的名字,这个名字直接来源于用户接口。然后,提供一个编辑控件用于收集输入文件的名字。下面代码为FileInputSynapse设置文件名。
// 这是包含输入数据的文件名
inputStream.setFileName(inputFile.getText());
如前所述,一个触角仅是一个神经原层之间的数据导管。FileInputSynapse正是这里的数据导管,通过它数据进入到神经网络。为了更容易实现这点,我们必须要把FileInputSynapse加到神经网络的输入层。这由下面一行实现。
input.addInputSynapse(inputStream);
现在既然已经建立起神经网络,我们必须创建一个训练员和一个监视器。训练员用于训练该神经网络,因为该监视器通过一个事先设置好的训练重复数来运行这个神经网络。对于每一次训练重复,数据被提供到神经网络,然后就可以观察到结果。该神经网络的权重(存储在穿梭在神经原层之间的触角连接中)将根据误差作适当调整。随着训练的进行,误差级将下降。下列代码建立训练员并把它依附到监视器。
trainer = new TeachingSynapse();
trainer.setMonitor(monitor);
你会记得列表1中提供的输入文件包含三个列。到目前为止,我们仅仅使用了第一、二列,它们指定了到神经网络的输入。第三列包含当提供给神经网络第一列中的数字时的期盼的输出值。我们必须使得训练员能够存取该列以便能确定误差。该错误是神经网络的实际输出和期盼的输出之间的差距。下列代码创建另外一个FileInputSynapse并作好准备以读取与前面相同的输入文件。
// 设置包含期望的响应值的文件,这由FileInputSynapse来提供
samples = new FileInputSynapse();
samples.setFileName(inputFile.getText());
这时,我们想指向在第三列的FileInputSynapse。下列代码实现了这一点,然后让训练员使用这个FileInputSynapse。
//输出值在文件中的第三列上
samples.setFirstCol(3);
samples.setLastCol(3);
trainer.setDesired(samples);
最后,训练员被连结到神经网络输出层,这将使训练员接收神经网络的输出。
// 连接训练员到网络的最后一层
output.addOutputSynapse(trainer);
我们现在已为所有的层准备好后台线程,包括训练员。
input.start();
hidden.start();
output.start();
trainer.start();
最后,我们为训练设置一些参数。我们指定在输入文件中共有四行,而且想训练20,000个周期,而且还在不段学习。如果你设置学习参数为false,该神经网络将简单地处理输入并不进行学习。我们将在下一节讨论输入处理。
monitor.setPatterns(4);
monitor.setTotCicles(20000);
monitor.setLearning(true);
现在我们已经为训练过程作好准备。调用监视器的Go方法将在后台启动训练过程。
monitor.Go();
神经网络现在将要被训练20,000个周期。当神经网络训练完成,误差层应该在一个合理的低级别上。一般低于10%的误差级是可接受的。
训练神经网络
为实现本文的目的,我们将指导JOONE去识别一个很简单的模式。在这种模式中,我们将考察一个二进制的布尔操作,例如XOR。这个XOR操作的真值表列举如下:
X Y X XOR Y
0 0 0
0 1 1
1 0 1
1 1 0
正如你从上表中看到的,XOR运算的结果是只有当X和Y具有不同值时,结果才为真(1)。其它情况下,XOR运算结果均为假(0)。默认地,JOONE从存储在你的系统中的文本文件中取得输入。这些文本文件通过使用一种称为FileInputSynapse的特殊触角来读取。为了训练XOR运算问题,你必须建立一个输入文件-该文件包含上面显示的数据。该文件显示在列表1中。
列表1:为解决XOR问题的输入文件的内容
0.0;0.0;0.0
0.0;1.0;1.0
1.0;0.0;1.0
1.0;1.0;0.0
我们现在分析一个简单的程序,它指导JOONE来识别XOR运算并产生正确的结果。我们现在分析训练该神经网络必须被处理的过程。训练过程包括把XOR问题提交给神经网络,然后观察结果。如果这个结果不是所预期的,该训练算法将调整存储在触角中的重量。在神经网络的实际输出和预料的输出之间的差距称为误差。训练将继续到误差小于一个可接受值为止。这个级别通常是一个百分数,如10%。我们现在分析必须用于训练一个神经网络的代码。
训练过程通过建立神经网络开始,同时也必须创建隐蔽的输入层和输出层。
// 首先,创造这三个层
input = new SigmoidLayer();
hidden = new SigmoidLayer();
output = new SigmoidLayer();
每个层被使用JOONE对象SigmoidLayer创建。Sigmoidlayer基于自然对数生成一个输出。JOONE还包含另外的层,而不是你可能选择使用的S形的层类型。
下一步,每一层被赋于一个名字。这些名字将有助于后面在调试期间识别该层。
input.setLayerName("input");
hidden.setLayerName("hidden");
output.setLayerName("output");
现在必须定义每个层。我们将指定在每一层中的"行"号。该"行"号对应于这一层中的神经原的数目。
input.setRows(2);
hidden.setRows(3);
output.setRows(1);
从上面的代码看出,输入层有两个神经原,隐蔽层有三个隐蔽神经原,输出层包含一个神经原。这对于神经网络包含两个输入神经原和一个输出神经原是具有重要意义的,因为XOR运算符接收两个参数而产生一个结果。
为使用该神经原层,我们也必须创建触角。在本例中,我们要使用多个触角。这些触角用下面的代码实现。
// 输入-> 隐蔽的连接。
FullSynapse synapse_IH = new FullSynapse();
// 隐蔽-> 输出连接。
FullSynapse synapse_HO = new FullSynapse();
就象神经原层的情况一样,触角也可能命名以有助于程序的调试。下面的代码命名新建的触角。
synapse_IH.setName("IH");
synapse_HO.setName("HO");
最后,我们必须把触角联接到适当神经原层。下面的代码实现这一点。
// 联接输入层到隐蔽层
input.addOutputSynapse(synapse_IH);
hidden.addInputSynapse(synapse_IH);
// 联接隐蔽层到输出层
hidden.addOutputSynapse(synapse_HO);
output.addInputSynapse(synapse_HO);
现在既然神经网络已被创建,我们必须创建一个用于调节该神经网络的监视器对象。下面的代码创建监视器对象。
//创建监视器对象并且设置学习参数
monitor = new Monitor();
monitor.setLearningRate(0.8);
monitor.setMomentum(0.3);
学习速度和动力作为参数以用于指定训练的产生方式。JOONE利用backpropagation学习算法。要更多了解关于学习速度或者动力的信息,你应该参考backpropagation算法。
这个监视器对象应该被赋值给每一个神经原层。下面的代码实现这一点。
input.setMonitor(monitor);
hidden.setMonitor(monitor);
output.setMonitor(monitor);
就象许多Java对象本身一样,JOONE监视器允许听者可以添加到它上面去。随着训练的进行,JOONE将通知听者有关训练进程的信息。在这个简单的例子中,我们使用:
monitor.addNeuralNetListener(this);
我们现在必须建立输入触角。如前所述,我们将使用一个FileInputSynapse来读取一个磁盘文件。磁盘文件不是JOONE唯一能够接受的输入种类。JOONE对于不同的输入源具有很强的灵活性。为使JOONE能够接收其它输入类型,你只需创建一个新的触角来接受输入。在本例中,我们将简单地使用FileInputSynapse。FileInputSynapse首先被实例化。
inputStream = new FileInputSynapse();
然后,必须通知FileInputSynapse要使用哪些列。列表1中显示的文件使用了输入数据的前两列。下面代码建立起前两列用于输入到神经网络。
// 前两列包含输入值
inputStream.setFirstCol(1);
inputStream.setLastCol(2);
然后,我们必须提供输入文件的名字,这个名字直接来源于用户接口。然后,提供一个编辑控件用于收集输入文件的名字。下面代码为FileInputSynapse设置文件名。
// 这是包含输入数据的文件名
inputStream.setFileName(inputFile.getText());
如前所述,一个触角仅是一个神经原层之间的数据导管。FileInputSynapse正是这里的数据导管,通过它数据进入到神经网络。为了更容易实现这点,我们必须要把FileInputSynapse加到神经网络的输入层。这由下面一行实现。
input.addInputSynapse(inputStream);
现在既然已经建立起神经网络,我们必须创建一个训练员和一个监视器。训练员用于训练该神经网络,因为该监视器通过一个事先设置好的训练重复数来运行这个神经网络。对于每一次训练重复,数据被提供到神经网络,然后就可以观察到结果。该神经网络的权重(存储在穿梭在神经原层之间的触角连接中)将根据误差作适当调整。随着训练的进行,误差级将下降。下列代码建立训练员并把它依附到监视器。
trainer = new TeachingSynapse();
trainer.setMonitor(monitor);
你会记得列表1中提供的输入文件包含三个列。到目前为止,我们仅仅使用了第一、二列,它们指定了到神经网络的输入。第三列包含当提供给神经网络第一列中的数字时的期盼的输出值。我们必须使得训练员能够存取该列以便能确定误差。该错误是神经网络的实际输出和期盼的输出之间的差距。下列代码创建另外一个FileInputSynapse并作好准备以读取与前面相同的输入文件。
// 设置包含期望的响应值的文件,这由FileInputSynapse来提供
samples = new FileInputSynapse();
samples.setFileName(inputFile.getText());
这时,我们想指向在第三列的FileInputSynapse。下列代码实现了这一点,然后让训练员使用这个FileInputSynapse。
//输出值在文件中的第三列上
samples.setFirstCol(3);
samples.setLastCol(3);
trainer.setDesired(samples);
最后,训练员被连结到神经网络输出层,这将使训练员接收神经网络的输出。
// 连接训练员到网络的最后一层
output.addOutputSynapse(trainer);
我们现在已为所有的层准备好后台线程,包括训练员。
input.start();
hidden.start();
output.start();
trainer.start();
最后,我们为训练设置一些参数。我们指定在输入文件中共有四行,而且想训练20,000个周期,而且还在不段学习。如果你设置学习参数为false,该神经网络将简单地处理输入并不进行学习。我们将在下一节讨论输入处理。
monitor.setPatterns(4);
monitor.setTotCicles(20000);
monitor.setLearning(true);
现在我们已经为训练过程作好准备。调用监视器的Go方法将在后台启动训练过程。
monitor.Go();
神经网络现在将要被训练20,000个周期。当神经网络训练完成,误差层应该在一个合理的低级别上。一般低于10%的误差级是可接受的
转载 用Java开源项目JOONE实现人工智能编程
很少有程序员不对这里或者那里所包含的人工智能编程所吸引,然而,许多对AI感兴趣的程序员很快就因其中包含的算法的复杂性而退却。在本文中,我们将讨论一个能大大简化这种复杂性的Java开源工程。
Java面向对象的神经网络(JOONE)是一开源工程,它提供给Java程序员一个高适应性的神经网络。该JOONE工程源代码由LGPL所保护。简言之,这意味着源代码是可自由使用的而且你不需要支付版税就可以使用JOONE。JOONE可以从http://joone.sourceforge.net/处下载。
JOONE能允许你轻易地从一个Java程序中创建神经网络。JOONE支持许多特征,如多线程和分布式处理。这意味着JOONE能利用多处理机计算机和多台计算机的优势来进行分布式处理。
神经网络
JOONE用Java实现了一个人工神经网络。一个人工神经网络试图仿效生物学神经网络的功能--神经网络组成今天在地球上几乎所有高等生命的大脑形式。神经网络由神经原组成。
从图1中你可以看出,神经原由一个内核细胞和几个长长的称为触角的连接器组成。神经原之间依靠这些触角进行连接。无论是生物学的还是人工的神经网络,都通过触角把信号从一个神经原传递到另一个神经原来工作。
使用JOONE
在这篇文章中,你将看到一个简单的怎样使用JOONE的实例。神经网络题目涉及广泛并覆盖许多不同的应用领域。在本文中,我们将展示给你怎样使用JOONE来解决一个很简单的模式识别问题。模式识别是神经网络中的最普遍的应用之一。
模式识别提供给神经网络一种模式,判断是否该神经网络能够识别出该模式。这种模式应该能够在某种程度上被扭曲而该神经网络仍然能够识别它。这很像人类识别东西(如一个交通标志)的能力。人类应该能够识别在下雨天,晴天或者晚上的交通标志。即使这些图像看上去可能相当不同,但人类的大脑仍能够判断出它们是一样的图像。
当进行JOONE编程时,你一般要使用两种类型的对象。你要使用神经原层对象,用于描述一层的一个或多个的具有相似特征的神经原。神经网络经常有一层或两层神经元。这些神经元层通过触角联系在一起。这些触角把这种待识别的模式,从一个神经元层传输到另一个神经元层。
触角不仅把这种模式从一个神经元层传输到另一个神经元层。触角还将生成一些指向这种模式的元素的斜线。这些斜线将导致这种模式的某些元素在被传输到下一个神经元层时不如通过其它方式传递更有效些。这些斜线通常称为权重,它们形成神经网络的存储系统。通过调整存储在触角中的这些权重,可以更改神经网络的行为。
触角在JOONE中还承担着另外一个角色。在JOONE中,可以把触角看作是数据导管。正如触角把模式从一个神经元层传输到另一个神经元层,指定版本的触角用于把模式传入和传出神经网络。下面将给你展示一个简单的单层的神经网络是怎样被构建并进行模式识别的。
训练神经网络
为实现本文的目的,我们将指导JOONE去识别一个很简单的模式。在这种模式中,我们将考察一个二进制的布尔操作,例如XOR。这个XOR操作的真值表列举如下:
X Y X XOR Y
0 0 0
0 1 1
1 0 1
1 1 0
正如你从上表中看到的,XOR运算的结果是只有当X和Y具有不同值时,结果才为真(1)。其它情况下,XOR运算结果均为假(0)。默认地,JOONE从存储在你的系统中的文本文件中取得输入。这些文本文件通过使用一种称为FileInputSynapse的特殊触角来读取。为了训练XOR运算问题,你必须建立一个输入文件-该文件包含上面显示的数据。该文件显示在列表1中。
列表1:为解决XOR问题的输入文件的内容
0.0;0.0;0.0
0.0;1.0;1.0
1.0;0.0;1.0
1.0;1.0;0.0
我们现在分析一个简单的程序,它指导JOONE来识别XOR运算并产生正确的结果。我们现在分析训练该神经网络必须被处理的过程。训练过程包括把XOR问题提交给神经网络,然后观察结果。如果这个结果不是所预期的,该训练算法将调整存储在触角中的重量。在神经网络的实际输出和预料的输出之间的差距称为误差。训练将继续到误差小于一个可接受值为止。这个级别通常是一个百分数,如10%。我们现在分析必须用于训练一个神经网络的代码。
训练过程通过建立神经网络开始,同时也必须创建隐蔽的输入层和输出层。
// 首先,创造这三个层
input = new SigmoidLayer();
hidden = new SigmoidLayer();
output = new SigmoidLayer();
每个层被使用JOONE对象SigmoidLayer创建。Sigmoidlayer基于自然对数生成一个输出。JOONE还包含另外的层,而不是你可能选择使用的S形的层类型。
下一步,每一层被赋于一个名字。这些名字将有助于后面在调试期间识别该层。
input.setLayerName("input");
hidden.setLayerName("hidden");
output.setLayerName("output");
现在必须定义每个层。我们将指定在每一层中的"行"号。该"行"号对应于这一层中的神经原的数目。
input.setRows(2);
hidden.setRows(3);
output.setRows(1);
从上面的代码看出,输入层有两个神经原,隐蔽层有三个隐蔽神经原,输出层包含一个神经原。这对于神经网络包含两个输入神经原和一个输出神经原是具有重要意义的,因为XOR运算符接收两个参数而产生一个结果。
为使用该神经原层,我们也必须创建触角。在本例中,我们要使用多个触角。这些触角用下面的代码实现。
// 输入-> 隐蔽的连接。
FullSynapse synapse_IH = new FullSynapse();
// 隐蔽-> 输出连接。
FullSynapse synapse_HO = new FullSynapse();
就象神经原层的情况一样,触角也可能命名以有助于程序的调试。下面的代码命名新建的触角。
synapse_IH.setName("IH");
synapse_HO.setName("HO");
最后,我们必须把触角联接到适当神经原层。下面的代码实现这一点。
// 联接输入层到隐蔽层
input.addOutputSynapse(synapse_IH);
hidden.addInputSynapse(synapse_IH);
// 联接隐蔽层到输出层
hidden.addOutputSynapse(synapse_HO);
output.addInputSynapse(synapse_HO);
现在既然神经网络已被创建,我们必须创建一个用于调节该神经网络的监视器对象。下面的代码创建监视器对象。
//创建监视器对象并且设置学习参数
monitor = new Monitor();
monitor.setLearningRate(0.8);
monitor.setMomentum(0.3);
学习速度和动力作为参数以用于指定训练的产生方式。JOONE利用backpropagation学习算法。要更多了解关于学习速度或者动力的信息,你应该参考backpropagation算法。
这个监视器对象应该被赋值给每一个神经原层。下面的代码实现这一点。
input.setMonitor(monitor);
hidden.setMonitor(monitor);
output.setMonitor(monitor);
就象许多Java对象本身一样,JOONE监视器允许听者可以添加到它上面去。随着训练的进行,JOONE将通知听者有关训练进程的信息。在这个简单的例子中,我们使用:
monitor.addNeuralNetListener(this);
我们现在必须建立输入触角。如前所述,我们将使用一个FileInputSynapse来读取一个磁盘文件。磁盘文件不是JOONE唯一能够接受的输入种类。JOONE对于不同的输入源具有很强的灵活性。为使JOONE能够接收其它输入类型,你只需创建一个新的触角来接受输入。在本例中,我们将简单地使用FileInputSynapse。FileInputSynapse首先被实例化。
inputStream = new FileInputSynapse();
然后,必须通知FileInputSynapse要使用哪些列。列表1中显示的文件使用了输入数据的前两列。下面代码建立起前两列用于输入到神经网络。
// 前两列包含输入值
inputStream.setFirstCol(1);
inputStream.setLastCol(2);
然后,我们必须提供输入文件的名字,这个名字直接来源于用户接口。然后,提供一个编辑控件用于收集输入文件的名字。下面代码为FileInputSynapse设置文件名。
// 这是包含输入数据的文件名
inputStream.setFileName(inputFile.getText());
如前所述,一个触角仅是一个神经原层之间的数据导管。FileInputSynapse正是这里的数据导管,通过它数据进入到神经网络。为了更容易实现这点,我们必须要把FileInputSynapse加到神经网络的输入层。这由下面一行实现。
input.addInputSynapse(inputStream);
现在既然已经建立起神经网络,我们必须创建一个训练员和一个监视器。训练员用于训练该神经网络,因为该监视器通过一个事先设置好的训练重复数来运行这个神经网络。对于每一次训练重复,数据被提供到神经网络,然后就可以观察到结果。该神经网络的权重(存储在穿梭在神经原层之间的触角连接中)将根据误差作适当调整。随着训练的进行,误差级将下降。下列代码建立训练员并把它依附到监视器。
trainer = new TeachingSynapse();
trainer.setMonitor(monitor);
你会记得列表1中提供的输入文件包含三个列。到目前为止,我们仅仅使用了第一、二列,它们指定了到神经网络的输入。第三列包含当提供给神经网络第一列中的数字时的期盼的输出值。我们必须使得训练员能够存取该列以便能确定误差。该错误是神经网络的实际输出和期盼的输出之间的差距。下列代码创建另外一个FileInputSynapse并作好准备以读取与前面相同的输入文件。
// 设置包含期望的响应值的文件,这由FileInputSynapse来提供
samples = new FileInputSynapse();
samples.setFileName(inputFile.getText());
这时,我们想指向在第三列的FileInputSynapse。下列代码实现了这一点,然后让训练员使用这个FileInputSynapse。
//输出值在文件中的第三列上
samples.setFirstCol(3);
samples.setLastCol(3);
trainer.setDesired(samples);
最后,训练员被连结到神经网络输出层,这将使训练员接收神经网络的输出。
// 连接训练员到网络的最后一层
output.addOutputSynapse(trainer);
我们现在已为所有的层准备好后台线程,包括训练员。
input.start();
hidden.start();
output.start();
trainer.start();
最后,我们为训练设置一些参数。我们指定在输入文件中共有四行,而且想训练20,000个周期,而且还在不段学习。如果你设置学习参数为false,该神经网络将简单地处理输入并不进行学习。我们将在下一节讨论输入处理。
monitor.setPatterns(4);
monitor.setTotCicles(20000);
monitor.setLearning(true);
现在我们已经为训练过程作好准备。调用监视器的Go方法将在后台启动训练过程。
monitor.Go();
神经网络现在将要被训练20,000个周期。当神经网络训练完成,误差层应该在一个合理的低级别上。一般低于10%的误差级是可接受的。
训练神经网络
为实现本文的目的,我们将指导JOONE去识别一个很简单的模式。在这种模式中,我们将考察一个二进制的布尔操作,例如XOR。这个XOR操作的真值表列举如下:
X Y X XOR Y
0 0 0
0 1 1
1 0 1
1 1 0
正如你从上表中看到的,XOR运算的结果是只有当X和Y具有不同值时,结果才为真(1)。其它情况下,XOR运算结果均为假(0)。默认地,JOONE从存储在你的系统中的文本文件中取得输入。这些文本文件通过使用一种称为FileInputSynapse的特殊触角来读取。为了训练XOR运算问题,你必须建立一个输入文件-该文件包含上面显示的数据。该文件显示在列表1中。
列表1:为解决XOR问题的输入文件的内容
0.0;0.0;0.0
0.0;1.0;1.0
1.0;0.0;1.0
1.0;1.0;0.0
我们现在分析一个简单的程序,它指导JOONE来识别XOR运算并产生正确的结果。我们现在分析训练该神经网络必须被处理的过程。训练过程包括把XOR问题提交给神经网络,然后观察结果。如果这个结果不是所预期的,该训练算法将调整存储在触角中的重量。在神经网络的实际输出和预料的输出之间的差距称为误差。训练将继续到误差小于一个可接受值为止。这个级别通常是一个百分数,如10%。我们现在分析必须用于训练一个神经网络的代码。
训练过程通过建立神经网络开始,同时也必须创建隐蔽的输入层和输出层。
// 首先,创造这三个层
input = new SigmoidLayer();
hidden = new SigmoidLayer();
output = new SigmoidLayer();
每个层被使用JOONE对象SigmoidLayer创建。Sigmoidlayer基于自然对数生成一个输出。JOONE还包含另外的层,而不是你可能选择使用的S形的层类型。
下一步,每一层被赋于一个名字。这些名字将有助于后面在调试期间识别该层。
input.setLayerName("input");
hidden.setLayerName("hidden");
output.setLayerName("output");
现在必须定义每个层。我们将指定在每一层中的"行"号。该"行"号对应于这一层中的神经原的数目。
input.setRows(2);
hidden.setRows(3);
output.setRows(1);
从上面的代码看出,输入层有两个神经原,隐蔽层有三个隐蔽神经原,输出层包含一个神经原。这对于神经网络包含两个输入神经原和一个输出神经原是具有重要意义的,因为XOR运算符接收两个参数而产生一个结果。
为使用该神经原层,我们也必须创建触角。在本例中,我们要使用多个触角。这些触角用下面的代码实现。
// 输入-> 隐蔽的连接。
FullSynapse synapse_IH = new FullSynapse();
// 隐蔽-> 输出连接。
FullSynapse synapse_HO = new FullSynapse();
就象神经原层的情况一样,触角也可能命名以有助于程序的调试。下面的代码命名新建的触角。
synapse_IH.setName("IH");
synapse_HO.setName("HO");
最后,我们必须把触角联接到适当神经原层。下面的代码实现这一点。
// 联接输入层到隐蔽层
input.addOutputSynapse(synapse_IH);
hidden.addInputSynapse(synapse_IH);
// 联接隐蔽层到输出层
hidden.addOutputSynapse(synapse_HO);
output.addInputSynapse(synapse_HO);
现在既然神经网络已被创建,我们必须创建一个用于调节该神经网络的监视器对象。下面的代码创建监视器对象。
//创建监视器对象并且设置学习参数
monitor = new Monitor();
monitor.setLearningRate(0.8);
monitor.setMomentum(0.3);
学习速度和动力作为参数以用于指定训练的产生方式。JOONE利用backpropagation学习算法。要更多了解关于学习速度或者动力的信息,你应该参考backpropagation算法。
这个监视器对象应该被赋值给每一个神经原层。下面的代码实现这一点。
input.setMonitor(monitor);
hidden.setMonitor(monitor);
output.setMonitor(monitor);
就象许多Java对象本身一样,JOONE监视器允许听者可以添加到它上面去。随着训练的进行,JOONE将通知听者有关训练进程的信息。在这个简单的例子中,我们使用:
monitor.addNeuralNetListener(this);
我们现在必须建立输入触角。如前所述,我们将使用一个FileInputSynapse来读取一个磁盘文件。磁盘文件不是JOONE唯一能够接受的输入种类。JOONE对于不同的输入源具有很强的灵活性。为使JOONE能够接收其它输入类型,你只需创建一个新的触角来接受输入。在本例中,我们将简单地使用FileInputSynapse。FileInputSynapse首先被实例化。
inputStream = new FileInputSynapse();
然后,必须通知FileInputSynapse要使用哪些列。列表1中显示的文件使用了输入数据的前两列。下面代码建立起前两列用于输入到神经网络。
// 前两列包含输入值
inputStream.setFirstCol(1);
inputStream.setLastCol(2);
然后,我们必须提供输入文件的名字,这个名字直接来源于用户接口。然后,提供一个编辑控件用于收集输入文件的名字。下面代码为FileInputSynapse设置文件名。
// 这是包含输入数据的文件名
inputStream.setFileName(inputFile.getText());
如前所述,一个触角仅是一个神经原层之间的数据导管。FileInputSynapse正是这里的数据导管,通过它数据进入到神经网络。为了更容易实现这点,我们必须要把FileInputSynapse加到神经网络的输入层。这由下面一行实现。
input.addInputSynapse(inputStream);
现在既然已经建立起神经网络,我们必须创建一个训练员和一个监视器。训练员用于训练该神经网络,因为该监视器通过一个事先设置好的训练重复数来运行这个神经网络。对于每一次训练重复,数据被提供到神经网络,然后就可以观察到结果。该神经网络的权重(存储在穿梭在神经原层之间的触角连接中)将根据误差作适当调整。随着训练的进行,误差级将下降。下列代码建立训练员并把它依附到监视器。
trainer = new TeachingSynapse();
trainer.setMonitor(monitor);
你会记得列表1中提供的输入文件包含三个列。到目前为止,我们仅仅使用了第一、二列,它们指定了到神经网络的输入。第三列包含当提供给神经网络第一列中的数字时的期盼的输出值。我们必须使得训练员能够存取该列以便能确定误差。该错误是神经网络的实际输出和期盼的输出之间的差距。下列代码创建另外一个FileInputSynapse并作好准备以读取与前面相同的输入文件。
// 设置包含期望的响应值的文件,这由FileInputSynapse来提供
samples = new FileInputSynapse();
samples.setFileName(inputFile.getText());
这时,我们想指向在第三列的FileInputSynapse。下列代码实现了这一点,然后让训练员使用这个FileInputSynapse。
//输出值在文件中的第三列上
samples.setFirstCol(3);
samples.setLastCol(3);
trainer.setDesired(samples);
最后,训练员被连结到神经网络输出层,这将使训练员接收神经网络的输出。
// 连接训练员到网络的最后一层
output.addOutputSynapse(trainer);
我们现在已为所有的层准备好后台线程,包括训练员。
input.start();
hidden.start();
output.start();
trainer.start();
最后,我们为训练设置一些参数。我们指定在输入文件中共有四行,而且想训练20,000个周期,而且还在不段学习。如果你设置学习参数为false,该神经网络将简单地处理输入并不进行学习。我们将在下一节讨论输入处理。
monitor.setPatterns(4);
monitor.setTotCicles(20000);
monitor.setLearning(true);
现在我们已经为训练过程作好准备。调用监视器的Go方法将在后台启动训练过程。
monitor.Go();
神经网络现在将要被训练20,000个周期。当神经网络训练完成,误差层应该在一个合理的低级别上。一般低于10%的误差级是可接受的
转载 用Java开源项目JOONE实现人工智能编程
发表评论
-
一些shell命令
2012-12-14 08:55 789作者:404null 一些强大的命令 再分享 ... -
唯递归论及其生物行为比较证据
2011-04-28 16:11 0本文发表于《现代外语》2010年第3期。如参考,请以《现代外语 ... -
唯递归论及其生物行为比较证据
2011-04-28 16:11 113在看一些关于递归的文章时,偶然发现的一篇paper。觉得有趣, ... -
给图片加水印(摘)
2008-03-15 14:48 376java给图片添加水印 package com.jhkj.ut ... -
Dwr对远程方法的批量调用(摘)
2007-07-17 08:54 977DWREngine.beginBatch();//批量调用减少 ... -
Dwr如何访问session(摘)
2007-07-17 08:51 810import uk.ltd.getahead.dwr.We ...
相关推荐
【Java开源项目JOONE】是面向Java程序员的一个强大的工具,它简化了人工智能编程中的复杂性,特别是神经网络的实现。JOONE(Java Object Oriented Neural Engine)是一个遵循LGPL许可的开源项目,允许开发者免费使用...
总的来说,Java开源神经网络框架JOONE结合Maven的使用,为Java开发人员提供了一种方便、高效的方式来实现神经网络模型。无论是学术研究还是商业项目,JOONE都能作为一个强大且灵活的工具,帮助开发者快速构建和训练...
Joone 是一个基于Java语言的开源神经网络框架,它的出现为开发者提供了一个在Java环境中构建、训练和应用神经网络的工具。Joone 的设计目标是易于使用,同时保持足够的灵活性,以便适应各种复杂的神经网络模型。 ...
Java神经网络组件,如Joone、Encog和Neuroph,为开发者提供了在Java环境中构建和训练神经网络的工具。这些开源库不仅简化了神经网络的实现,还为初学者和经验丰富的数据科学家提供了深入了解神经网络工作原理的机会...
在标题中提到的"java实现神经网络",是指Joone框架使用Java编程语言来创建神经网络模型。Java作为一种跨平台的编程语言,具有良好的可移植性和高效的执行能力,因此Joone能够运行在多种操作系统上,如Windows、Linux...
【Java实现人工智能编程】 在Java编程领域,人工智能的实现往往涉及到复杂的算法和计算,而JOONE(Java Object Oriented Neural Engine)是一个专为简化这一过程的开源项目。JOONE为Java程序员提供了一个高度适应性...
Joone这个名字是“Java Object Oriented Neural Engine”的缩写,表明其核心设计理念是面向对象编程,以实现对神经网络的灵活控制。 在神经网络领域,Joone Engine允许开发者构建各种类型的神经网络,包括前馈型...
Joone 是一个开源的人工智能框架,主要用于神经网络的研究和应用。这个压缩包可能包含了关于Joone框架的源代码、文档、示例或其他相关资源。从"源码"和"工具"这两个标签来看,我们可以期待在文件中找到与编程、理解...
Joone 1.2.1 是一个基于Java的开源神经网络框架,专为开发者提供工具来构建、训练和应用神经网络模型。这个框架的核心在于它的灵活性和可扩展性,允许用户自定义网络结构和学习算法,以适应各种复杂的机器学习任务。...
JOONE的出现填补了Java在神经网络领域的一些空白,使得Java开发者无需转而使用其他语言,如Python或R,也能进行高效的神经网络编程。 JOONE的核心设计理念是提供一个稳定、可扩展且用户友好的平台,用于实现神经...
这个库为开发者提供了在Java环境中实现神经网络算法的工具,使得复杂的人工神经网络模型可以在Java应用程序中轻松集成。"joone-javadoc.zip" 文件是一个包含Joone库API文档的压缩包,通常这样的文档是Javadoc格式,...
JOONE(Java Object Oriented Neural Network)是sourceforge上一个用java语言迅速开发神经网络的开源项目。JOONE支持很多的特性,比如多线程和分布式计算,这意味着可以JOONE可以利用多处理器或是多计算机来均衡附载
Joone是一个开源的人工智能神经网络库,使用Java语言编写,能够在各种平台上运行。Joone可以应用于各种需要神经网络技术的领域,如图像识别、自然语言处理、机器学习等。 Joone的特点 Joone具有以下特点: * 跨...
Java神经网络库Joone是一个强大的工具,用于在Java环境中构建和运行神经网络模型。这个库提供了丰富的功能,允许开发者创建复杂的...对于那些希望在Java项目中实现神经网络功能的开发者,Joone是一个值得尝试的选择。
4. **使用joone与LTSM**:虽然joone主要支持的是传统的人工神经网络模型,但理论上,通过扩展和自定义,可以实现LTSM模型。用户可能需要利用joone的底层接口,结合其他Java库(如Deeplearning4j)的LTSM实现,或者将...
Joone是一个基于Java语言的开源项目,专注于神经网络的快速开发。该项目托管在SourceForge上,为开发者提供了一个强大而灵活的平台,用于构建、训练和应用神经网络模型。源码包"joone.zip_joone"包含了JOONE项目的...
Joone 是一个开源的人工智能项目,专注于神经网络的研究与实现。这个压缩包包含了两个关键文件:`joone-javadoc.zip` 和 `joone.jar`。`joone.jar` 文件是 Joone 库的核心,它提供了对神经网络操作的类和方法,允许...
Joone是一个开源项目,它的全称是"Java Object Oriented Neural Engine",即面向对象的Java神经引擎。它提供了一套灵活的API,可以构建和操作多层前馈神经网络(feedforward neural networks),包括简单的感知器...
JOONE(Java Object Oriented Neural Network)是sourceforge上一个用java语言迅速开发神经网络的最新工具包