深度學習一:自己寫java代碼,訓練一個神經元

神經網絡與深度學習這本書是我學習深度學習的啓蒙教材,感興趣可以到鏈接出下載。通過一段時間的學習,感覺基本理解了梯度下降算法和反向傳播算法,於是嘗試着自己寫代碼來實現神經網絡。一開始總是很難的,所以我設計了個非常簡單的目標,訓練一個神經元。比如我給他輸入1,我期望它輸出0,這就是一個反相器。我希望它能做到這一點,所以我對他進行訓練。
訓練一個神經元能簡化梯度下降算法和反向傳播算法的實現,也能幫助我們更好的理解升經這兩個算法。對於初學深度學習的人來說,勇敢的邁出第一步非常的重要,因此,如果你能成功的訓練一個神經元,那也意味着你在深度學習的學習中邁出了重要的一步。
關於梯度下降算法和反向傳播算法,還是需要你認真閱讀推薦的書籍,這兩個算法是深度學習的基石,一定要徹底弄懂才行。
如果在網頁上代碼不太好看,你可以在這裏下載源碼:
源碼

首先定義一個神經元類:

public class NeureCell {
	private double w = 0;
	private double b = 0;
	private double out = 0;
	private int in = 0;
	public void setIn(int in){
		this.in = in;
	}
	public void setWandB(double w,double b){
		this.w = w;
		this.b = b;
	}
	public double getW(){return w;}
	public double getB(){return b;}
	public double getOut(){
		double z = in*w+b;
		return 1/(1+Math.exp(-z));
	}
}

使用梯度下降算法訓練神經網絡

import java.util.Random;

public class DeepLearn {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		NeureCell cell = new NeureCell();
		Random random = new Random();
		//init w and b
		double eta = 3;//learn speed
		cell.setWandB(random.nextDouble(), random.nextDouble());
		cell.setIn(1);
		double a0 = cell.getOut();
		double dw = 0.2*eta*a0;	
		double db = 0.2*eta*a0;	
		cell.setWandB(cell.getW()-dw, cell.getB()-db);
		for(int i=0;i<200;i++){
			cell.setIn(1);
			double ai = cell.getOut();
			dw = 0.2*eta*ai;	
			db = 0.2*eta*ai;	
			cell.setWandB(cell.getW()-dw, cell.getB()-db);
			System.out.println(ai);
		}
		
	}

}

結果如下:
這裏寫圖片描述

可以看到這個輸出越來越接近與0了。
這裏使用的是最簡單的二次代價函數:
這裏寫圖片描述

反向傳播算法可以概括爲一下五步:
這裏寫圖片描述
如果你能理解這五步,那麼你就會明白,這點代碼完全就是按照這個步驟做了一遍而已。


我最新重寫的卷積神經網絡CupCnn在mnist準確率可達99%了,CupCnn也是用java寫的,但是代碼更規範,更加模塊化,以下是CupCnn在github上的地址,歡迎大家下載:
CupCnn
更多詳情請參考我的博文:
java寫卷積神經網絡—CupCnn簡介

發佈了116 篇原創文章 · 獲贊 247 · 訪問量 54萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章