首页 > 代码库 > 基于开源JOONE 神经网络实例
基于开源JOONE 神经网络实例
作者:北邮小生-chaosju
1.入门书籍推荐: 人工神经网络教程-韩力群 北京邮电大学出版社
写算法要了解算法的原理,方能写出好算法,明白原理实现算法 事半功倍
2.Joone
JOONE(Java Object Oriented Neural Network)是sourceforge.net上一个用java语言迅速开发神经网络的开源项目。JOONE支持很多的特性,比如多线程和分布式计算,这意味着可以JOONE可以利用多处理器或是多计算机来均衡附载。
JOONE主要有三个大的模块:
joone-engine:joone的核心模块。
joone-editor:joone的gui开发环境。不用编写一行代码就建立神经网络模型,并可以进行训练和验证。Joone中提供了一个用joone-editor建立xor网络模型的例子,本文中的神经网络就是参考这个例子所完成的。
joone-distributed-environment :joone用于支持分布式计算的模块。
文档,源码下载地址:http://www.codertodeveloper.com/docs/documentation.html
-----------学会读一手的东西,直接看文档源码
3.XOR(异或)实例的实现
public class XOR_Test implements NeuralNetListener,Serializable { private static final long serialVersionUID = -3597853311948127352L; private FileInputSynapse inputStream = null; private NeuralNet nnet = null;
public static void main(String args[]) { XOR_Test xor = new XOR_Test(); xor.initNeuralNet(); } protected void initNeuralNet() { // 三层:输入层 ,隐层,输出层 // create the three layers (using the sigmoid transfer function for the // hidden and the output layers) LinearLayer input = new LinearLayer(); SigmoidLayer hidden = new SigmoidLayer(); SigmoidLayer output = new SigmoidLayer(); // set their dimensions(神经元): // 设置每层神经元的个数 input.setRows(2); hidden.setRows(3); output.setRows(1); // Now build the neural net connecting the layers by creating the two // synapses(突触) // 三层需要两个突触对其进行连接,创建神经元 FullSynapse synapse_IH = new FullSynapse(); /* Input -> Hidden conn. */ FullSynapse synapse_HO = new FullSynapse(); /* Hidden -> Output conn. */ // 连接操作 // Next connect the input layer with the hidden layer: input.addOutputSynapse(synapse_IH); hidden.addInputSynapse(synapse_IH); // and then, the hidden layer with the output layer: hidden.addOutputSynapse(synapse_HO); output.addInputSynapse(synapse_HO); // need a NeuralNet object that will contain all the Layers of the // network // 创建一个网络来容纳各层 nnet = new NeuralNet(); nnet.addLayer(input, NeuralNet.INPUT_LAYER); nnet.addLayer(hidden, NeuralNet.HIDDEN_LAYER); nnet.addLayer(output, NeuralNet.OUTPUT_LAYER); Monitor monitor = nnet.getMonitor(); // 设定神经网络的学习率, monitor.setLearningRate(0.8); // 设定神经网络的动量 为 0.3 这两个变量与步长有关 monitor.setMomentum(0.3); monitor.addNeuralNetListener(this); // 输入流 inputStream = new FileInputSynapse(); /* The first two columns contain the input values */ inputStream.setAdvancedColumnSelector("1,2"); /* This is the file that contains the input data */ inputStream.setInputFile(new File("E:\\joone\\XOR.txt")); // Next add the input synapse to the first layer. input.addInputSynapse(inputStream); TeachingSynapse trainer = new TeachingSynapse(); /* * Setting of the file containing the desired responses, provided by a * FileInputSynapse */ FileInputSynapse samples = new FileInputSynapse(); samples.setInputFile(new File("e:\\joone\\XOR.txt")); /* The output values are on the third column of the file */ samples.setAdvancedColumnSelector("3"); trainer.setDesired(samples); output.addOutputSynapse(trainer); /* We attach the teacher to the network */ nnet.setTeacher(trainer); monitor.setTrainingPatterns(4); /* # of rows in the input file */ monitor.setTotCicles(100000); /* How many times the net must be trained*/ monitor.setLearning(true); /* The net must be trained */ nnet.go(); /* The network starts the training phase */ } @Override public void netStarted(NeuralNetEvent e) { System.out.println("Training..."); } @Override public void cicleTerminated(NeuralNetEvent e) { Monitor mon = (Monitor)e.getSource(); long c = mon.getCurrentCicle(); /* We want print the results every 100 epochs */ if (c % 100 == 0) System.out.println(c + " epochs remaining - RMSE = " + mon.getGlobalError()); } @Override public void netStopped(NeuralNetEvent e) { System.out.println("Training Stopped..."); long mystr = System.currentTimeMillis(); // 初始化当前的系统时间 System.out.println(mystr); saveNeuralNet("d://xor.snet"); // 保存生成当前时间的myxor.snet神经网络 test(); } public void test(){ NeuralNet xorNNet = this.restoreNeuralNet("D://xor.snet"); if (xorNNet != null) { // we get the output layer Layer output = xorNNet.getOutputLayer(); // we create an output synapse FileOutputSynapse fileOutput = new FileOutputSynapse(); fileOutput.setFileName("d://xor_out.txt"); // we attach the output synapse to the last layer of the NN output.addOutputSynapse(fileOutput); // we run the neural network only once (1 cycle) in recall mode xorNNet.getMonitor().setTotCicles(1); xorNNet.getMonitor().setLearning(false); xorNNet.go(); } } @Override public void errorChanged(NeuralNetEvent e) { Monitor mon = (Monitor) e.getSource();// 得到监控层的信息 long c = mon.getCurrentCicle(); if (c % 100 == 0) System.out.println("Cycle: " + (mon.getTotCicles() - mon.getCurrentCicle()) + " RMSE:" + mon.getGlobalError()); // 输出 训练的次数和 rmse 均方误差 } 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(); } } NeuralNet restoreNeuralNet(String fileName) { NeuralNetLoader loader = new NeuralNetLoader(fileName); NeuralNet nnet = loader.getNeuralNet(); return nnet; } @Override public void netStoppedError(NeuralNetEvent e, String error) { // TODO Auto-generated method stub } }
程序的输出结果:
0.0022572691083591304
0.9972511752900466
0.9972455081943005
0.0037839413733784474
和异或的结果一直,训练的次数约多,结果越接近-------0.1
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。