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的结果表现为线性不可分,用简单的感知机模型是无法完成训练的,当采用更多层的网络。