感知器
最近看到一篇博客,由浅入深地讲解了机器学习中的神经网络,但是由于它其中的实现代码是python,我也想更加深入的了解一波儿,就用java也实现了一套,实现功能是一样的。
感知器模型结构图:
Notice:通过设置一个值恒为一的节点,可以把误差和权重的计算统一起来,其中值恒唯一的节点对应的权重表示误差(bias)。
这里的代码是实现对于一个感知器的神经网络,输入是二维向量,输出一个数(0,1),通过简单的学习实现对于and 和 or 运算的拟合
import java.util.Arrays;
public class Perceptron implements IPerceptron{
//输入节点
private double[] inputArray;
//权重,最后一个输入节点(1.d)对应的是误差
private double[] weights;
//输出节点
private double output;
//输入节点个数
private int inputLength;
//学习系数
private double rate;
public Perceptron(int inputLength, double rate) {
this.inputLength = inputLength;
this.inputArray = new double[inputLength+1];
//设置误差项
this.inputArray[inputLength] = 1.d;
this.weights = new double[inputLength+1];
this.output = 0.d;
this.rate = rate;
}
//激活函数:表示为阶跃函数
public double activotor(double x) {
return Double.compare(x,0.d) > 0? 1.d:0.d;
}
//前向运算
public void predict() {
double sum = 0;
for (int i = 0; i < inputArray.length; i++) {
sum += inputArray[i]*weights[i];
}
this.output = activotor(sum);
}
//前向运算重载方法
public double predict(double[] inputs) {
for (int i = 0; i < inputLength; i++) {
inputArray[i] = inputs[i];
}
predict();
return this.output;
}
//后向运算
public void backwards(double delta) {
for (int i = 0; i < inputArray.length; i++) {
weights[i] += rate*delta*inputArray[i];
}
System.out.println(Arrays.toString(weights));
}
//训练方法
public void train(double[][] trainData,double[] labels, int batch){
for (int i = 0; i < batch; i++) {
for (int j = 0; j < trainData.length; j++) {
for (int k = 0; k < trainData[j].length; k++) {
inputArray[k] = trainData[j][k];
}
predict();
backwards(labels[j]-output);
}
}
}
public static void main(String[] args) {
double[][] trainData = {{0,0},{0,1},{1,0},{1,1}};
double[] labels = {0,0,0,1};
Perceptron perceptron = new Perceptron(2,0.1);
perceptron.train(trainData,labels,10);
for (int i = 0; i < trainData.length; i++) {
double predict = perceptron.predict(trainData[i]);
System.out.println(Arrays.toString(trainData[i]) +": "+predict);
}
}
}
运行结果:
感悟:对于神经网络的代码debug比较有难度,纯手打的代码也不好维护,在项目中还是用成熟的框架比较好,手打只是为了更加深入的理解。