package com.pintn.joone;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Date;
import java.util.Vector;
import org.joone.engine.FullSynapse;
import org.joone.engine.LinearLayer;
import org.joone.engine.Monitor;
import org.joone.engine.NeuralNetEvent;
import org.joone.engine.NeuralNetListener;
import org.joone.engine.Pattern;
import org.joone.engine.SigmoidLayer;
import org.joone.engine.learning.TeachingSynapse;
import org.joone.io.MemoryInputSynapse;
import org.joone.io.MemoryOutputSynapse;
import org.joone.net.NeuralNet;
public class XOR_using_NeuralNet_RPROP implements NeuralNetListener,Serializable {
private NeuralNet nnet = null; /* 初始化数据网络为空*/
private MemoryInputSynapse inputSynapse, desiredOutputSynapse; /*声明MemoryInputSynapse 的两个对象,输入神经元和 期望输出神经元为数组变量 */
private MemoryOutputSynapse outputSynapse;
// XOR input 双精度型二维数组 inputArray 并初始化 作为神经元的两个输入变量的数组
private double[][] inputArray = new double[][] {
{0.0, 0.0},
{0.0, 1.0},
{1.03, 0.0},
{0.98, 1.0}
};
// XOR desired output 双精度型二维数组 inputArray 并初始化 作为神经元的期望输出变量的数组
private double[][] desiredOutputArray = new double[][] {
{0.0},
{1.0},
{0.103},
{0.0}
};
public static void main(String args[]) {
XOR_using_NeuralNet_RPROP xor = new XOR_using_NeuralNet_RPROP();
xor.initNeuralNet();
xor.train();
}
protected void initNeuralNet() { //神经网络的初始化函数
// First create the three layers
LinearLayer input = new LinearLayer();
SigmoidLayer hidden = new SigmoidLayer();
SigmoidLayer output = new SigmoidLayer();
// set the dimensions of the layers
input.setRows(2); // 输入层神经元的个数为2 因为 异或(0,1)(1,1)(1,1)(0,0)
hidden.setRows(3); //隐含层的神经元个数为 3 这个要根据实际的经验选取
output.setRows(1); //输出层的神经元个数为 1 输出异或运算结果
// Now create the two Synapses
FullSynapse synapse_IH = new FullSynapse();
FullSynapse synapse_HO = new FullSynapse();
// Connect the input layer whit the hidden layer
input.addOutputSynapse(synapse_IH);
hidden.addInputSynapse(synapse_IH);
// Connect the hidden layer whit the output layer
hidden.addOutputSynapse(synapse_HO);
output.addInputSynapse(synapse_HO);
// the input to the neural net
inputSynapse = new MemoryInputSynapse();
input.addInputSynapse(inputSynapse); //将输入神经元的输入作为神经网络 突触的输入变量
// the output of the neural net
outputSynapse = new MemoryOutputSynapse();
output.addOutputSynapse(outputSynapse);//将输出神经元的输出作为神经网络突触的输入变量
// The Trainer and its desired output
desiredOutputSynapse = new MemoryInputSynapse();
TeachingSynapse trainer = new TeachingSynapse();
trainer.setDesired(desiredOutputSynapse); //建立教师层,监视神经网络
// Now we add this structure to a NeuralNet object//添加上面建立的神经网络的结构到神经网络
nnet = new NeuralNet();
nnet.addLayer(input, NeuralNet.INPUT_LAYER);
nnet.addLayer(hidden, NeuralNet.HIDDEN_LAYER);
nnet.addLayer(output, NeuralNet.OUTPUT_LAYER);
nnet.setTeacher(trainer);
output.addOutputSynapse(trainer);
}
public void train() {
// set the inputs
inputSynapse.setInputArray(inputArray); //神经网络的输入数组为inputArray数组
inputSynapse.setAdvancedColumnSelector("1,2");//选择inputArray数组 前两个变量为输入变量
// set the desired outputs
desiredOutputSynapse.setInputArray(desiredOutputArray);
desiredOutputSynapse.setAdvancedColumnSelector("1");//选择outputArray数组前一个变量为输出变量
// get the monitor object to train or feed forward 建立监控连接 和 误差的前向反馈
Monitor monitor = nnet.getMonitor();
// set the monitor parameters
monitor.setLearningRate(0.8); //设定神经网络的学习率,
monitor.setMomentum(0.3);//设定神经网络的动量 为 0.3 这两个变量与步长有关
monitor.setTrainingPatterns(inputArray.length);//训练的模式为输入数组的长度
monitor.setTotCicles(5000); //设定总训练次数为5000
// RPROP parameters
// monitor.getl
// monitor.getLearner().add(0, "org.joone.engine.RpropLearner");
// monitor.getLearners().add(0, "org.joone.engine.RpropLearner");
monitor.setBatchSize(7);//修改
monitor.setLearningMode(0);
monitor.setLearning(true);//待学习的训练监控
nnet.addNeuralNetListener(this);//监听神经网络
nnet.start(); //数据网路开始训练
nnet.getMonitor().Go();//神经网络开始监控,并运行
}
public void cicleTerminated(NeuralNetEvent e) {
System.out.println("cicleTerminated...");//训练终结
}
public void errorChanged(NeuralNetEvent e) {
// System.out.println("error...");
Monitor mon = (Monitor)e.getSource();//得到监控层的信息
System.out.println("Cycle: "+(mon.getTotCicles()-mon.getCurrentCicle())+" RMSE:"+mon.getGlobalError()); //输出 训练的次数和 rmse 均方误差
}
public void netStarted(NeuralNetEvent e) {
System.out.println("Training...");
}
public void netStopped(NeuralNetEvent e) {
System.out.println("Training Stopped...");
System.out.println(5000);
Monitor mon = (Monitor)e.getSource();
// Read the last pattern and print it out
Vector patts = outputSynapse.getAllPatterns();
Pattern pattern = (Pattern)patts.elementAt(patts.size() - 1);
System.out.println("Output Pattern = " + pattern.getArray()[0] + " Error: " + mon.getGlobalError()); //输出最后的输出的结果和RMSE值
Date Mydate =new Date(); //初始化一个时间对象
long mystr = System.currentTimeMillis(); //初始化当前的系统时间
System.out.println(mystr);
saveNeuralNet("d:"+ mystr +"myxor.snet"); //保存生成当前时间的myxor.snet神经网络
}
public void saveNeuralNet(String fileName) {
try {
FileOutputStream stream = new FileOutputStream(fileName);
ObjectOutputStream out = new ObjectOutputStream(stream);
out.writeObject(nnet);//写入nnet对象
out.close();
}
catch (Exception excp) {
excp.printStackTrace();
}
}
private NeuralNet restoreNeuralNet(String fileName) {
NeuralNet nnet = null;
try {
FileInputStream stream = new FileInputStream(fileName);
ObjectInput input = new ObjectInputStream(stream);
nnet = (NeuralNet)input.readObject();
}
catch (Exception e) {
System.out.println( "Exception was thrown. Message is : " + e.getMessage());
}
return nnet;
}
public void netStoppedError(NeuralNetEvent e, String error) {
}
}
分享到:
相关推荐
你可以创建一个简单的Java程序来加载和训练网络,或者运行Joone提供的示例。 3. **调试与优化**:通过阅读源码,你可以了解Joone的内部运作机制,进一步进行定制化开发或性能优化。 4. **文档阅读**:虽然没有明确...
这个压缩包可能包含了关于Joone框架的源代码、文档、示例或其他相关资源。从"源码"和"工具"这两个标签来看,我们可以期待在文件中找到与编程、理解和使用Joone相关的技术细节。 Joone框架的核心是其神经网络实现,...
2. **神经网络模型**:Joone允许用户定义和配置不同的神经网络模型,包括多层感知器(MLP)、径向基函数网络(RBF)、自组织映射(SOM)等。这些模型可以用于分类、回归、预测等多种任务。 3. **训练算法**:Joone...
2. **Joone架构**:Joone库的核心组件包括神经元(Neuron)、层(Layer)、网络(Network)和学习算法(Learning Algorithm)。用户可以通过这些组件构建自己的网络结构,并选择合适的训练算法进行模型优化。 3. **...
2. **Java对象导向神经网络引擎(joone)**:joone是一个用纯Java编写的神经网络库,它提供了构建和训练各种神经网络模型的工具。joone支持前馈神经网络、自组织映射(SOM)、Hopfield网络等,并且允许用户自定义...
而"samples"目录则很可能包含了一些示例项目,这些示例可以帮助初学者快速理解和使用Joone Engine,通过实际操作学习如何创建、训练和应用神经网络模型。 总的来说,Joone Engine是一个强大且灵活的Java神经网络...
2. **训练算法**:Joone包含多种训练算法,如反向传播(Backpropagation)、 resilient backpropagation(RPROP)、Levenberg-Marquardt等,这些算法可以帮助用户优化网络权重,提高模型的预测精度。 3. **数据...
JooneCompleteGuide.pdf 很可能是Joone框架的完整指南,里面可能包含了详细的使用教程、API参考以及示例,帮助开发者快速上手。Joone-ext.zip 和 joone-engine-2.0.0RC1.zip 可能分别包含了Joone的扩展库和引擎库,...
2. **Joone Engine**:Joone Engine是一个基于Java的神经网络开发平台,它允许开发者创建和训练自定义的神经网络模型。Joone Engine提供了丰富的API,可以方便地创建、连接神经元、设置学习算法等,支持前馈型、反馈...
而`joone-engine-2.0.0RC2-20070314.zip`则是Joone引擎的具体实现,包含了库文件和可能的示例代码,供开发者在项目中引入和使用。 总的来说,Joone框架为Java开发者提供了一个强大的工具,可以用于构建复杂的神经...
为了帮助开发者更好地理解和使用JOONE,该框架提供了详尽的文档和示例代码,覆盖了从安装、基本用法到高级特性的方方面面。JOONE的源码开放,鼓励用户根据实际需求对其进行定制和扩展,这进一步增强了其在实际项目中...
2. **Readme.txt**:这是标准的开源项目文档,通常包含项目的简介、安装指南、使用示例、许可信息等内容。对于Joone Engine,Readme文件将帮助我们快速了解如何集成和使用这个库。 3. **org** 和 **releases**:这...
2. **网络定义**:根据问题需求创建神经网络架构,设定输入、隐藏和输出层的节点数量。 3. **数据准备**:提供训练和测试数据集,如XOR问题中的{[0, 0], [0]}, {[0, 1], [1]}, {[1, 0], [1]}和{[1, 1], [0]}。 4. **...
以下是一个简单的示例,展示了如何使用JOONE创建一个神经网络并训练它进行XOR操作: ```java // 创建输入、隐藏和输出层 SigmoidLayer input = new SigmoidLayer(); SigmoidLayer hidden = new SigmoidLayer(); ...
### j2ee joone 技术论文知识点解析 #### 一、概述 本文档探讨了在J2EE平台上,如何利用JSF(JavaServer Faces)技术实现数据表控件的分页功能,以应对大数据量访问及高并发访问场景下的性能优化需求。J2EE是一个...
此外,还提供了丰富的示例代码和最佳实践,帮助读者快速上手并掌握Joone的核心功能。 ##### 1.4 致谢 本书感谢所有对Joone项目做出贡献的开发者和支持者,没有他们的努力和奉献,Joone不会取得今天的成就。 #### ...
Neural-Networks-in-Neuroph-Encog-and-JOO.pdf"文档,该文档详细分析了这三个框架在实现XOR网络时的具体代码和效果,以及"ThreeNetworks.zip"文件,其中包含了使用这三个库实现的XOR网络示例代码,可以作为实践和...
以下是一个简单的JOONE程序示例,展示了如何构建神经网络并进行训练: 1. 首先,创建输入层、隐藏层和输出层: ```java SigmoidLayer input = new SigmoidLayer(); SigmoidLayer hidden = new SigmoidLayer(); ...
**应用示例** Neuroph可用于多种应用场景,例如图像识别、文本分类、股票市场预测、语音识别等。以下是一个简单的例子,演示如何使用Neuroph创建一个多层前馈网络: 1. 导入Neuroph库:首先,你需要在项目中导入...