简单BP神经网络的Java实现

本文介绍了初学者如何使用Java编程实现基本的BP(Backpropagation)神经网络,包括BP.java文件的详细功能和运行结果的截图展示。
摘要由CSDN通过智能技术生成

初学神经网络,利用Java实现简单的BP,现记录下来。

1、BP.java文件,具体功能见代码注释

/**
 * 简单BP网络的Java实现
 * 3层网络
 * 激活函数sigmoid
 * 注意:
 * 1、输入层的神经元个数和训练集的列数一致,训练集的每一行为一个特征向量。
 * 2、输出层神经元的个数和标签的列数一致,标签的每一列相当于一个特征向量训练的结果
 * @author yuliyan
 */
public class BP extends Matrix{
	public double[][] x;//训练集
	public double[][] y;//标签
	public double[][] v;//输入层到隐藏层的权值
	public double[][] w;//隐藏层到输出层的权值
	public double lr;//学习率
	public BP(double[][] x,double[][] y,int input,int hidden,int output,double lr) {
		this.x= x;
		this.y=y;
		this.v= weigth(input, hidden);
		this.w= weigth(hidden, output);
		this.lr=lr;
	}
	/**
	 * 初始化权值
	 * @param row
	 * @param col
	 * @return
	 */
	public static double[][] weigth(int row,int col){
		double[][] result = new double[row][col];
		for(int i=0;i<row;i++){
			for(int j=0;j<col;j++){
				result[i][j] = Math.random()*2-1;
			}
		}
		return result;
	}
	/**
	 * 训练一次
	 */
	public void train(){
		//隐藏层输出
		double[][] L1 = sigmoid(matrixmultiple(x, v));//4*5
		//输出层输出
		double[][] L2 = sigmoid(matrixmultiple(L1, w));//4*3
		
		//隐藏层到输出层权值调整
		double[][] delta_2 = matrix_mu(matrixsub(y,L2),dsigmoid(L2));//(y-L2)*dsigmoid(L2)  4*3
		w= matrixadd(w, matrixmultiple(matrixmultiple(T(L1), delta_2), lr));
		
		//输入层到隐藏层权值调整
		double[][] delta_1 =  matrix_mu(matrixmultiple(delta_2,T(w)),dsigmoid(L1));
		v = matrixadd(v, matrixmultiple(matrixmultiple(T(x), delta_1), lr));
	}
	/**
	 * 多次迭代训练
	 * @param range 迭代次数
	 */
	public void train(int range){
		for(int i=0;i<range;i++){
			train();
			if(i%100==0){
				//隐藏层输出
				double[][] L1 = sigmoid(matrixmultiple(x, v));
				//输出层输出
				double[][] L2 = sigmoid( matrixmultiple(L1,  w));
				double temp = 0;
				for(int j=0;j<y.length;j++){
					for(int k=0;k<y[0].length;k++)
						temp+=Math.abs(y[j][k]-L2[j][k]);
				}
				//输出误差
				System.out.println("error:"+temp/(y.length*y[0].length
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值