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

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


你可能感兴趣的:(java,机器学习)