按照神经网络与深度学习这本书进行学习,记录过程如下:
刚进行到第二章:neuroph框架学习
第一步:创建Java Maven project(不会,自行百度)
第二步:记住勾选上图中打√的地方,然后next
按照图片描述然后点击Finish
第三步:按照上面图片两步走,第二步过后进入下面的界面
第四步:打开浏览器输入下图红色选中框中的网址
第五步:比如我搜索的是java的神经网络框架neuroph,里面有很多各种各样的架包
第六步:复制上述代码贴到如下位置
点击保存过后基本上就是一路绿灯了。
参考此人博客的例子跑一下:http://blog.csdn.net/xiaopangxia/article/details/54707742
code:
package web.v1;
import java.util.Arrays;
import org.neuroph.core.NeuralNetwork;
import org.neuroph.core.data.DataSet;
import org.neuroph.core.data.DataSetRow;
import org.neuroph.nnet.Perceptron;
/**
* 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.addRow(new DataSetRow(new double[]{0, 0}, new double[]{0}));
trainOrSet.addRow(new DataSetRow(new double[]{0, 1}, new double[]{1}));
trainOrSet.addRow(new DataSetRow(new double[]{1, 0}, new double[]{1}));
trainOrSet.addRow(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,觉得还是很神奇的。