您的位置:首页 > 理论基础 > 计算机网络

基于开源JOONE 神经网络实例

2014-06-05 14:36 295 查看
作者:北邮小生-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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息