基于开源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

基于开源JOONE 神经网络实例

时间: 2024-07-29 15:14:00

基于开源JOONE 神经网络实例的相关文章

基于开源技术的上网行为管理方案实现案例

基于开源技术的上网行为管理方案实现案例 互联网已经成为人们工作.生活过程不可或缺的工具.在企业普遍存在着电脑和互联网络滥用的严重问题,网购.各种直播.电影.P2P工具下载等与工作无关的行为占用了有限的带宽,影响了工作,作为企业如何监管?购买商业软件?我看,未必适合你的公司. 选择开源工具怎么样?下面我为大家介绍两款开源工具及案例.用以实现用户上网内容审计和行为监控.这些技术的基础基于嗅探技术,所以大家在浏览下文时,一定要对网络嗅探技术有深刻理解. 1.开源工具Xplico Xplico工作原理是

阿里云数据库产品HybridDB简介——OLAP数据库,支持行列混合存储,为用户提供基于开源 OLTP、OLAP、BigData 生态的一站式解决方案

12 月 9 日,阿里云宣布数据库产品 HybridDB 正式商业化. HybridDB(ApsaraDB HybridDB)是一款在线 MPP 大规模并行处理数据仓库的服务.它基于 Pivotal 公司的开源数据库项目 Greenplum Database 开发,并由阿里云数据库团队在云计算架构下深度扩展. 该服务支持了 OSS 存储.JSON 数据类型.HyperLogLog 预估分析等功能特性.通过符合 SQL2008 标准查询语法及 OLAP 分析聚合函数,提供灵活的混合分析能力.提供在

vc 基于对话框多线程编程实例——线程之间的通信

 vc基于对话框多线程编程实例--线程之间的通信 实例: vc 基于对话框多线程编程实例--线程之间的通信,码迷,mamicode.com

《开源框架那点事儿13》:基于开源框架做应用是未来中小型软件公司的发展趋势

在我的周边朋友身边就发生过这样的事情: 故事1:A君在北京从事Java开发好多年了,萌发了创业的念头,想组建了一个开发团队想大干一场.但是慢慢发现,构建一个有战斗力的团队真不容易.后来技术团队的组建初步有了起色,但是技术路线却非常难成一致意见.折腾来折腾去,把有点上道的技术人员都折腾得跳槽了.费了巨高的成本搞了一个架构师,就是利用SSH框架搭建了一个开发环境,数据量小,业务初期还是不错的,但是当业务快速增长的时候,运行速度就无法满足需要了.是重新来过还是在SSH的基础上继续折腾,非常难以抉择!

SpringMVC详解(三)------基于注解的入门实例

前两篇博客我们讲解了基于XML 的入门实例,以及SpringMVC运行的详细流程.但是我们发现基于 XML 的配置还是比较麻烦的,而且,每个 Handler 类只能有一个方法,在实际开发中肯定是不可能这样来进行开发的.那么这篇博客我们就讲解实际开发中用的最多的基于注解配置的SpringMVC配置. 本篇博客源码下载 项目结构为: 1.在 web.xml 文件中配置前端处理器 <?xml version="1.0" encoding="UTF-8"?> &

Oracle 12c 基于ASM 的单实例 搭建手册

从Oracle 10g开始,Oracle 开始推广ASM的使用,到了11g,RAC 集群已经必须使用ASM,所以对ASM的掌握程度也决定RAC的运维水平,这篇Blog 演示 Oracle12c 基于ASM 的单实例的的环境搭建. 这样即可以玩12c 的ASM,又不需要起2个集群,从而方便学习.具体环境搭建步骤如下. 1  安装需要的RPM 包 binutils-2.20.51.0.2-5.11.el6 (x86_64) glibc-2.12-1.7.el6 (x86_64) libgcc-4.4

BaseAnimation是基于开源的APP,致力于收集各种动画效果(最新版本1.3) (转)

声明:部分动画来源于网络,本人只是想方便收集在一起,如果不妥请及时与我联系!谢谢 为了统一BaseAnimationApp签名,一定要方便以后大家自动更新...防止签名冲突,不能及时更新 BaseAnimation讨论群号:149581646 1.3源码下载地址:http://download.csdn.net/detail/u011112840/6910683 1.3APP下载地址:http://as.baidu.com/a/item?docid=5790764 1.2源码下载地址:http:

SpringMVC应用------基于注解的入门实例

SpringMVC应用------基于注解的入门实例 目录 1.在 web.xml 文件中配置前端处理器 2.在 springmvc.xml 文件中配置处理器映射器,处理器适配器,视图解析器 3.编写 Handler 4.编写 视图 index.jsp 5.在浏览器中输入:http://localhost:8080/SpringMVC-003/hello 前两篇博客我们讲解了基于XML 的入门实例,以及SpringMVC运行的详细流程.但是我们发现基于 XML 的配置还是比较麻烦的,而且,每个

基于开源,强于开源,轻舟微服务解决方案深度解读

本文来自网易云社区. 2018年7月31日,由杭州市政府.赛迪以及网易主办的"2018中国杭州云创大会"于杭州国际博览中心如期举办,大会以"开放·生态·赋能"为主题,汇聚行业领袖.技术大咖及产业链从业者.随着数字经济的时代到来,企业数字化创新对新一代云计算服务的需求日渐迫切.在下午的云计算专题会中,网易云邀请了来自各行业的新老客户,深度研讨云计算赋能企业数字化创新的探索和实践. 网易云副总经理 陈谔 网易云副总经理陈谔认为:"IT已经从成本中心提升到创新中