您的位置:首页 > 运维架构

Neuroph训练简单逻辑运算感知机

2017-01-24 15:01 459 查看
Neuroph是一个开源的java神经网络框架,

Neuroph是自带一个图形化的神经网络工具的,叫Neuroph Studio

在自己的java代码中引入neuroph也很方便,添加从官网下的一堆jar包就行。

所谓感知机(perceptron),应该算是最简单的神经网络吧

用Neuroph提供的perceptron类实现一个简单的感知机,学习简单的逻辑运算(AND、OR和XOR)

import org.neuroph.core.NeuralNetwork;
import org.neuroph.core.data.DataSet;
import org.neuroph.core.data.DataSetRow;
import org.neuroph.nnet.Perceptron;

import java.util.Arrays;
/**
* Created by 阿龙 on 2017/1/24.
*/
public class CalculatePerceptron{
public static void main(String args[]){
// 建立AND训练集
DataSet trainAndSet = new DataSet(2, 1);
trainAndSet.addRow(new DataSetRow(new double[]{0, 0}, new double[]{0}));
trainAndSet.addRow(new DataSetRow(new double[]{0, 1}, new double[]{0}));
trainAndSet.addRow(new DataSetRow(new double[]{1, 0}, new double[]{0}));
trainAndSet.addRow(new DataSetRow(new double[]{1, 1}, new double[]{1}));

// 建立OR训练集
DataSet trainOrSet = new DataSet(2, 1);
trainOrSet.add(new DataSetRow(new double[]{0, 0}, new double[]{0}));
trainOrSet.add(new DataSetRow(new double[]{0, 1}, new double[]{1}));
trainOrSet.add(new DataSetRow(new double[]{1, 0}, new double[]{1}));
trainOrSet.add(new DataSetRow(new double[]{1, 1}, new double[]{1}));

// 建立XOR训练集
DataSet trainXorSet = new DataSet(2, 1);
trainXorSet.addRow(new DataSetRow(new double[]{0, 0}, new double[]{0}));
trainXorSet.addRow(new DataSetRow(new double[]{0, 1}, new double[]{1}));
trainXorSet.addRow(new DataSetRow(new double[]{1, 0}, new double[]{1}));
trainXorSet.addRow(new DataSetRow(new double[]{1, 1}, new double[]{0}));

// 建立感知机
NeuralNetwork myPerceptron = new Perceptron(2, 1);
// 训练AND集
myPerceptron.learn(trainAndSet);
System.out.println("测试感知机AND集训练结果:");
myPerceptron.save("AND_learn_result.nnet");
testNeuralNetwork(myPerceptron, trainAndSet);

// 训练OR集
myPerceptron.learn(trainOrSet);
System.out.println("测试感知机Or集训练结果:");
myPerceptron.save("OR_learn_result.nnet");
testNeuralNetwork(myPerceptron, trainOrSet);

// 训练XOR集
// 由于XOR输入输出情况线性不可分,将无法完成训练
myPerceptron.learn(trainXorSet);
System.out.println("测试感知机Xor集训练结果:");
testNeuralNetwork(myPerceptron, trainXorSet);

}
public static void testNeuralNetwork(NeuralNetwork nnet, DataSet tset) {

for (DataSetRow dataRow : tset.getRows()) {

nnet.setInput(dataRow.getInput());
nnet.calculate();
double[ ] networkOutput = nnet.getOutput();
System.out.print("Input: " + Arrays.toString(dataRow.getInput()) );
System.out.println(" Output: " + Arrays.toString(networkOutput) );
}
}
}


运行结果
测试感知机AND集训练结果:
Input: [0.0, 0.0] Output: [0.0]
Input: [0.0, 1.0] Output: [0.0]
Input: [1.0, 0.0] Output: [0.0]
Input: [1.0, 1.0] Output: [1.0]
测试感知机Or集训练结果:
Input: [0.0, 0.0] Output: [0.0]
Input: [0.0, 1.0] Output: [1.0]
Input: [1.0, 0.0] Output: [1.0]
Input: [1.0, 1.0] Output: [1.0]
没有中间层,只有输入层与输出层。
一开始感知机中的权值W以及内部权值(那个常数)是随机给的。

可以看到经过四条训练数据的训练,感知机可以无误地对AND和OR运算训练集中的输入做出响应。

但是XOR运算的学习却无法完成,迭代不止。这与运算本身性质有关,XOR的结果表现为线性不可分,用简单的感知机模型是无法完成训练的,当采用更多层的网络。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息