人類的大腦很擅長於鑒別和識別物體,我們希望機器也可以做同樣的事情。一個神經網絡就是一個模仿人類大腦激發學習過程的框架。神經網絡被用於從數據中識別隱藏的模式。正如所有的學習算啊,神經網絡處理的是數字。因此,如果想要實現處理現實世界中任何包含圖像、文字、傳感器等的任務,就必須將其轉換成數值形式,然后將其輸入到一個神經網絡。我們可以用神經網絡做分類,聚類,生成以及其他相關的任務。
神經網絡由一層層神經元組成。這些神經元模擬人類大腦中的生物神經元。每一層都是一組獨立的神經元,這些神經元與相鄰層的神經元相連。輸入層對應我們提供的輸入數據,而輸出層包括了我們期望的輸出結果。輸入層與輸出層之間的層統稱為隱藏層。如果設計的神經網絡包括多個隱藏層,那么通過這些層的自我訓練獲得更大的精確度。
假如我們希望神經網絡按照我們的要求來對數據進行分類。為了使神經網絡完成相應的任務,需要提供帶標簽的訓練數據。神經網絡將通過優化成本函數來訓練自己。我們不停的迭代,知道錯誤率下降到一個我們能夠接受的閥值。那么深度神經網絡是什么?深度神經網絡是由多個隱藏層組成的神經網絡。一般來書這就屬於深度學習的范疇。深度學習用於研究這些神經網絡,而這些神經網絡由多個層次的多層結構組成。
python中提供了神經網絡的第三發庫NeuroLab庫,你可以通過pip install NeuroLab安裝適合你的python環境的版本,也可以去官網上去下載源碼安裝。接下來我們就通過NeuroLab實現一個深層神經網絡:
1 import numpy as np 2 import neurolab as nl 3 import matplotlib.pyplot as plt 4 5 #生成訓練數據 6 min_value=-12 7 max_value=12 8 num_datapoints=90 9 10 x=np.linspace(min_value,max_value,num_datapoints) 11 12 y=2*np.square(x)+7 13 y/=np.linalg.norm(y) 14 15 data = x.reshape(num_datapoints,1) 16 labels=y.reshape(num_datapoints,1) 17 18 #畫出輸入數據 19 plt.figure() 20 plt.scatter(data,labels) 21 plt.xlabel('X-axis') 22 plt.ylabel('Y-axis') 23 plt.title('Input data') 24 plt.show() 25 26 #定義一個深度神經網絡,帶有兩個隱藏層,每個隱藏層由10個神經元組成,輸出層由一個神經元組成 27 multilayer_net = nl.net.newff([[min_value,max_value]],[10,10,10,10,1]) 28 29 #設置訓練算法為梯度下降法 30 multilayer_net.trainf = nl.train.train_gd 31 32 #訓練網絡 33 error = multilayer_net.train(data,labels,epochs=800,show=100,goal=0.01) 34 35 #用訓練數據運行該網絡,預測結果 36 predicted_output=multilayer_net.sim(data) 37 38 #畫出訓練誤差結果 39 plt.figure() 40 plt.plot(error) 41 plt.xlabel('Number of epoches') 42 plt.ylabel('Error') 43 plt.title('Training error progress') 44 plt.show() 45 46 #畫出預測結果 47 x2=np.linspace(min_value,max_value,num_datapoints*2) 48 y2=multilayer_net.sim(x2.reshape(x2.size,1)).reshape(x2.size) 49 y3=predicted_output.reshape(num_datapoints) 50 51 plt.figure() 52 plt.plot(x2,y2,'-',x,y,'.',x,y3,'p') 53 plt.title('Ground truth va predicted output') 54 plt.show()
運行代碼可以看到我們實現了一個深度神經網絡,該神經網絡包含兩個隱藏層,每個隱藏層包含10個神經元,並且使用梯度下降算法訓練。可以看到3副圖像:
第一幅圖像顯示輸入數據圖像:
第二幅圖像顯示訓練誤差進程:
第三幅圖像顯示神經網絡的輸出: