神经网络JOONE的实践
什么是joone
Joone是一个免费的神经网络框架来创建,训练和测试人造神经网络。目标是为最热门的Java技术创造一个强大的环境,为热情和专业的用户。
Joone由一个中央引擎组成,这是Joone开发的所有应用程序的支点。Joone的神经网络可以建立在本地机器上,在分布式环境中进行培训,并在任何设备上运行。
每个人都可以编写新的模块来实现从核心引擎分发的简单组件开始的新算法或新架构。主要思想是为围绕核心框架推出数百万个人工智能应用的基础。
一些功能...
- [x] 监督学习:
- [x] 前馈神经网络(FFNN)
- [x] 递归神经网络(Elman,Jordan,...)
- [x] 时间延迟神经网络(TDNN)
- [x] 标准背支(梯度下降,在线和批量)
- [x] 弹性支撑(RPROP)
无监督学习:
- [x] Kohonen SOM(用WTA或高斯输出图)
- [x] 主成分分析(PCA)
- [x] 模块化神经网络(即混合所有上述架构的可能性)
- [x] 强大的内置数据预处理机制
- [x] 脚本功能(JavaScript),以便向NN添加自定义行为
- 已有资料
- [x] http://blog.csdn.net/u010223750/article/details/51334365 与官网资料大相迳庭,但是没有解决对照关系.
- 资源链接
- [x] http://www.jooneworld.com/download.html
基础例子异或运算
- 可能大家会有疑问为什么还是异或运算,为什么不能换点其他的呢,进行异或运算数据量小,可以取得很好的学习效果.
- 几个关键点:
- LinearLayer 单组神经网络 线性
- SigmoidLayer 单组神经网络 线性
- FullSynapse 连接神经网络的突触
- NeuralNet 神经网络容器
- Monitor 监视器 类似管理器
- 基本运用流程
- 构造适用于模型的神经网络
- 根据模型控制的数据的流动控制i/o
- moniter开启学习过程
- 不得不注意: 单个类必须实现 NeuralNetListener
- 展现编码:
private NeuralNet neuralNet;
private Monitor monitor;
private SigmoidLayer out, hidden;
private LinearLayer in;
public static void main(String[] args) {
Xor xor = new Xor();
xor.init_nulnetwork();
xor.dualData("res/xor.txt", "res/result.txt");
// xor.name("res/xor.txt", "res/result.txt");
try { Thread.sleep(1000); } catch (InterruptedException doNothing) { }
xor.interrogate();
}
private void interrogate() {
double[][] inputArray = new double[][] { { 0.0, 1.0 } };
// set the inputs
neuralNet.getMonitor().setLearning(false);
MemoryInputSynapse inputSynapse = new MemoryInputSynapse();
inputSynapse.setInputArray(inputArray);
inputSynapse.setAdvancedColumnSelector("1,2");
neuralNet.removeAllInputs();
neuralNet.removeAllOutputs();
neuralNet.addInputSynapse(inputSynapse);
MemoryOutputSynapse memOut = new MemoryOutputSynapse();
neuralNet.addOutputSynapse(memOut);
if (neuralNet != null) {
neuralNet.getMonitor().setSingleThreadMode(false);
neuralNet.go();
for (int i = 0; i < 4; i++) {
double[] nextPattern = memOut.getNextPattern();
System.out.println(nextPattern[0]);
}
System.exit(0);
}
}
public void dualData(String inpath, String outpath) {
// 输入数据突触
FileInputSynapse inputSynapse = new FileInputSynapse();
inputSynapse.setInputFile(new File(inpath));
inputSynapse.setAdvancedColumnSelector("1,2");
// 传入数据突触
in.addInputSynapse(inputSynapse);
// 训练突触
TeachingSynapse Teaching = new TeachingSynapse();
// 结果对应
FileInputSynapse in_resultsynapse = new FileInputSynapse();
in_resultsynapse.setInputFile(new File(inpath));
in_resultsynapse.setAdvancedColumnSelector("3");
// 期望结果
Teaching.setDesired(in_resultsynapse);
// 输出数据突触
out.addOutputSynapse(Teaching);
/* Creates the error output file */
FileOutputSynapse error = new FileOutputSynapse();
error.setFileName(outpath);
// error.setBuffered(false);
Teaching.addResultSynapse(error);
neuralNet.setTeacher(Teaching);
monitor.setLearning(true);
monitor.setTrainingPatterns(4);
monitor.setTotCicles(2000);
neuralNet.go();
}
public void init_nulnetwork() {
// 构造三个神经网络
in = new LinearLayer("in");
out = new SigmoidLayer("out");
hidden = new SigmoidLayer("hidden");
// 定义每个网络的神经数
in.setRows(2);
hidden.setRows(3);
out.setRows(1);
// 创建神经突触
FullSynapse synapseone = new FullSynapse();
FullSynapse synapsetwo = new FullSynapse();
// 连接突触 in->hidden
in.addOutputSynapse(synapseone);
hidden.addInputSynapse(synapseone);
// hidden>out
out.addInputSynapse(synapsetwo);
hidden.addOutputSynapse(synapsetwo);
// 创建容器
neuralNet = new NeuralNet();
neuralNet.addLayer(in, NeuralNet.INPUT_LAYER);
neuralNet.addLayer(out, NeuralNet.OUTPUT_LAYER);
neuralNet.addLayer(hidden, NeuralNet.HIDDEN_LAYER);
neuralNet.addNeuralNetListener(this);
monitor = neuralNet.getMonitor();
monitor.addNeuralNetListener(this);
// 学习速度
monitor.setLearningRate(0.8);
// 学习梯度
monitor.setMomentum(0.9);
}
@Override
public void cicleTerminated(NeuralNetEvent arg0) {
}
@Override
public void errorChanged(NeuralNetEvent arg0) {
Monitor source = (Monitor) arg0.getSource();
if (source.getCurrentCicle() % 100 == 0)
System.out.println(source.getCurrentCicle() + " epochs remaining - RMSE = " + source.getGlobalError());
}
@Override
public void netStarted(NeuralNetEvent arg0) {
System.out.println("star ..............");
}
@Override
public void netStopped(NeuralNetEvent arg0) {
}
@Override
public void netStoppedError(NeuralNetEvent arg0, String arg1) {
}
运行效果展示
- 控制台打印内容
star ..............
1900 epochs remaining - RMSE = 0.47600682941789274
1800 epochs remaining - RMSE = 0.4193120542959407
1700 epochs remaining - RMSE = 0.3615907922936926
1600 epochs remaining - RMSE = 0.043037310196610556
1500 epochs remaining - RMSE = 0.029465401358726946
1400 epochs remaining - RMSE = 0.023733896256020553
1300 epochs remaining - RMSE = 0.020388084386553255
1200 epochs remaining - RMSE = 0.01813347388867849
1100 epochs remaining - RMSE = 0.0164837281607376
1000 epochs remaining - RMSE = 0.015209973541172709
900 epochs remaining - RMSE = 0.014188572240857322
800 epochs remaining - RMSE = 0.013346142747488585
700 epochs remaining - RMSE = 0.012636035607807258
600 epochs remaining - RMSE = 0.012026998316013436
500 epochs remaining - RMSE = 0.011497207806982808
400 epochs remaining - RMSE = 0.011030904955155142
300 epochs remaining - RMSE = 0.010616388884900461
200 epochs remaining - RMSE = 0.010244766308025021
100 epochs remaining - RMSE = 0.009909141567578732
- 可以看出,上面列表中的第一行中的数字合理地接近于零。这是很好的,因为输入训练文件的第一行,如列表1所示,被预期结果是为零的。同样,第二行合理地接近于1,这也很好,因为训练文件的第二行被预期结果也是为1的。
- 训练文件格式
0;0;0
1;0;1
1;1;0
0;1;1
设置的 setAdvancedColumnSelector 可以挑出来的需要的数据内容
存储问题
如果你在大量数据的训练,在每一次训练结束时,当前的结果不会在下一次启动学习时进行结果保存的.那么解决的办法是什么呢?
那肯定的java的序列化解决 你只需要的实现Serializable接口.
对于joonetools工具类 只需要 使用load 方法载入即可.
下面给出一个工具类例子:
package extend.java.Seriobject;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
/**
*
* @author DGW-PC
* 对象的序列化与反序列化
*/
public class TestSerializable {
private final static String filepath="rouseces/temp.xor";
public static void main(String[] args) {
/*User user = new User(123, "dgw", "男");
TestSerializable serializable = new TestSerializable();
try {
serializable.writeObject(user);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/
TestSerializable serializable = new TestSerializable();
try {
User object = (User)serializable.readObject();
System.out.println(object.toString());
} catch (ClassNotFoundException | IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void writeObject(Object o) throws IOException {
File file = new File(filepath);
if (file.exists()) {
file.delete();
}
FileOutputStream outputStream = new FileOutputStream(file);
ObjectOutputStream objectWrite = new ObjectOutputStream(outputStream);
objectWrite.writeObject(o);
objectWrite.close();
outputStream.close();
}
@SuppressWarnings("resource")
public Object readObject() throws IOException, ClassNotFoundException {
File file = new File(filepath);
if (!file.exists()) {
throw new FileNotFoundException();
}
FileInputStream inputStream = new FileInputStream(file);
ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
return objectInputStream.readObject();
}
}
其他问题
实现NeuralNetListener 神经网络训练过程中的一些监听函数:
- icleTerminated:每个循环结束后输出的信息
- errorChanged:神经网络错误率变化时候输出的信息
- netStarted:神经网络开始运行的时候输出的信息
- netStopped:神经网络停止的时候输出的信息
验证代码:
private void interrogate() {
double[][] inputArray = new double[][] { { 0.0, 1.0 } };
// 设置输入
neuralNet.getMonitor().setLearning(false);
MemoryInputSynapse inputSynapse = new MemoryInputSynapse();
inputSynapse.setInputArray(inputArray);
inputSynapse.setAdvancedColumnSelector("1,2");
neuralNet.removeAllInputs();
neuralNet.removeAllOutputs();
neuralNet.addInputSynapse(inputSynapse);
MemoryOutputSynapse memOut = new MemoryOutputSynapse();
neuralNet.addOutputSynapse(memOut);
if (neuralNet != null) {
neuralNet.getMonitor().setSingleThreadMode(false);
neuralNet.go();
for (int i = 0; i < 4; i++) {
double[] nextPattern = memOut.getNextPattern();
System.out.println(nextPattern[0]);
}
System.exit(0);
}
}
- 当输入0,1输出内容
100 epochs remaining - RMSE = 0.009909141567578732
[main] [WARN] - org.joone.net.NeuralNet - Termination requested but net appears not to be running.
star ..............
0.9908896675722858
- 当输入0,0 是输出的内容
400 epochs remaining - RMSE = 0.010399344820751158
300 epochs remaining - RMSE = 0.010045322272865264
200 epochs remaining - RMSE = 0.009724485002708847
100 epochs remaining - RMSE = 0.009431977897288895
[main] [WARN] - org.joone.net.NeuralNet - Termination requested but net appears not to be running.
star ..............
0.008214361744075686
由上面的两个数据内容比较可以知道 在进行4个数据比较过后 ,达到了学习的预期的目的,0.0表示不成立结果为0 ,0.99 表示结果成立,结果为1
封装joonetools工具类的例子
- 更多的验证器例子:请参照官方api文档
package org.basics.code;
import org.joone.helpers.factory.JooneTools;
import org.joone.net.NeuralNet;
public class Tools {
// XOR 输入值
private static double[][] inputArray = new double[][] {
{0.0, 0.0},
{0.0, 1.0},
{1.0, 0.0},
{1.0, 1.0}
};
// XOR 期望值
private static double[][] desiredArray = new double[][] {
{0.0},
{1.0},
{1.0},
{0.0}
};
public static void main(String[] args) {
try {
// 创建3个sigmoid神经网络,序列为2 2 1
NeuralNet nnet = JooneTools.create_standard(new int[]{ 2, 2, 1 }, JooneTools.LOGISTIC);
nnet.getMonitor().setSingleThreadMode(true);
/**
* 参数意义:
* 1. 网络容器
* 2. 输入,期末数组
* 3.5000 个递归梯度
* 4. 步进为0.01
* 5. 形式为输出
* 6.异步模式
*/
double rmse = JooneTools.train(nnet, inputArray, desiredArray,
5000, 0.01,
200, System.out, false);
// 避免的时间片重叠
try { Thread.sleep(50); } catch (InterruptedException doNothing) { }
// 更直观的验证列表
System.out.println("Last RMSE = "+rmse);
System.out.println("\nResults:");
System.out.println("|Inp 1\t|Inp 2\t|Output");
for (int i=0; i < 4; ++i) {
double[] output = JooneTools.interrogate(nnet, inputArray[i]);
System.out.print("| "+inputArray[i][0]+"\t| "+inputArray[i][1]+"\t| ");
System.out.println(output[0]);
}
// 测试结果
double testRMSE = JooneTools.test(nnet, inputArray, desiredArray);
System.out.println("\nTest error = "+testRMSE);
} catch (Exception exc) { exc.printStackTrace(); }
}
}
神经网络JOONE的实践的更多相关文章
- 数据挖掘系列(9)——BP神经网络算法与实践
神经网络曾经很火,有过一段低迷期,现在因为深度学习的原因继续火起来了.神经网络有很多种:前向传输网络.反向传输网络.递归神经网络.卷积神经网络等.本文介绍基本的反向传输神经网络(Backpropaga ...
- 用Java开源项目JOONE实现人工智能编程
http://www.robotsky.com/ZhiN/MoS/2011-08-25/13142461416649.html 用Java开源项目JOONE实现人工智能编程 https://sourc ...
- 利用神经网络算法的C#手写数字识别
欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 下载Demo - 2.77 MB (原始地址):handwritten_character_recognition.zip 下载源码 - 70. ...
- BP神经网络的手写数字识别
BP神经网络的手写数字识别 ANN 人工神经网络算法在实践中往往给人难以琢磨的印象,有句老话叫“出来混总是要还的”,大概是由于具有很强的非线性模拟和处理能力,因此作为代价上帝让它“黑盒”化了.作为一种 ...
- 积神经网络(CNN)的参数优化方法
http://www.cnblogs.com/bonelee/p/8528863.html 积神经网络的参数优化方法——调整网络结构是关键!!!你只需不停增加层,直到测试误差不再减少. 积神经网络(C ...
- 利用神经网络算法的C#手写数字识别(一)
利用神经网络算法的C#手写数字识别 转发来自云加社区,用于学习机器学习与神经网络 欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 下载Demo - 2.77 MB (原始地址):handwri ...
- Number plate recognition with Tensorflow
2015年5月 在此处 http://matthewearl.github.io/2016/05/06/cnn-anpr/#rd 寻觅出 使用TenserFlow的车牌号识别 技术. 感觉很有必要 ...
- [Hinton] Neural Networks for Machine Learning - Converage
Link: Neural Networks for Machine Learning - 多伦多大学 Link: Hinton的CSC321课程笔记 Ref: 神经网络训练中的Tricks之高效BP ...
- 使用PyTorch建立图像分类模型
概述 在PyTorch中构建自己的卷积神经网络(CNN)的实践教程 我们将研究一个图像分类问题--CNN的一个经典和广泛使用的应用 我们将以实用的格式介绍深度学习概念 介绍 我被神经网络的力量和能力所 ...
随机推荐
- 201521123075 《Java程序设计》第14周学习总结
1. 本周学习总结 2. 书面作业 1. MySQL数据库基本操作 建立数据库,将自己的姓名.学号作为一条记录插入.(截图,需出现自己的学号.姓名) 在自己建立的数据库上执行常见SQL语句(截图) 参 ...
- 201521123031 《Java程序设计》第11周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) ...
- Shiro第六篇【验证码、记住我】
验证码 在登陆的时候,我们一般都设置有验证码,但是我们如果使用Shiro的话,那么Shiro默认的是使用FormAuthenticationFilter进行表单认证. 而我们的验证校验的功能应该加在F ...
- MyEclipse 快捷键问题
解决Myeclipse提示快捷键Alt+/不可用问题 http://blog.163.com/cd-key666/blog/static/648929422011229123826/ 解决Myecli ...
- [转]iOS 应用程序的生命周期
OS的应用程序的生命周期,还有程序是运行在前台还是后台,应用程序各个状态的变换,这些对于开发者来说都是很重要的. iOS系统的资源是有限的,应用程序在前台和在后台的状态是不一样的.在后台时,程序会受到 ...
- Excel开发之旅
开发环境:Microsoft Visual Studio 2015,Office 2013 开发语言:C# 1.创建工程:文件à新建à项目,选择office 外接程序àExcel 2013和2016 ...
- Angular2组件与指令的小实践
如果说模块系统是Angular2的灵魂,那其组件体系就是其躯体,在模块的支持下渲染出所有用户直接看得见的东西,一个项目最表层的东西就是组件呈现的视图.而除了直接看的见的躯体之外,一个完整的" ...
- class DELPHICLASS TObject
class DELPHICLASS TObject 1.自己猜想:delphi,是windows平台的快速应用程序开发工具Rapid Application Development 简称RAD. ...
- JSP入门 el表达式
我们已经知道el是jsp-2.0规范的一部分,tomcat-5.x版本以上都已经能够支持jsp-2.0规范,但在更低版本的tomcat和webphere,weblogic中还是无法使用这一便捷方式. ...
- H5页面解决IOS进入不自动播放问题(微信内)
废话少说,直接上代码. 主要还是调用微信的jdk做兼容处理.,安卓可自动播放. ($(function(){ $(function(){ /* ** 复选框*/ $('.ul-radio').on(' ...