神经网络变学习率算法代码_机器学习算法之神经网络
點擊藍字關注我哦
人工神經網絡(Artificial Neural Networks,ANN)系統是 20 世紀 40 年代后出現的。它是由眾多的神經元可調的連接權值連接而成,具有大規模并行處理、分布式信息存儲、良好的自組織自學習能力等特點。人工神經網絡是由大量的簡單基本元件——神經元相互聯接而成的自適應非線性動態系統。本次實驗任務帶領大家學習如何使用Python代碼實現神經網絡算法。通過本任務,您將掌握以下內容:1.掌握神經網絡的結構。2.掌握神經網絡算法的原理。3.掌握使用Python語言實現神經網絡算法。【實驗目的】
1.掌握神經網絡算法的原理。
2.掌握使用Python語言實現神經網絡算法。
【實驗原理】
在機器學習和認知科學領域,人工神經網絡(artificial neural network,縮寫ANN),簡稱神經網絡(neural network,縮寫NN)或類神經網絡,是一種模仿生物神經網絡(動物的中樞神經系統,特別是大腦)的結構和功能的數學模型或計算模型,用于對函數進行估計或近似。神經網絡由大量的人工神經元聯結進行計算。大多數情況下人工神經網絡能在外界信息的基礎上改變內部結構,是一種自適應系統。現代神經網絡是一種非線性統計性數據建模工具。我們來了解一下什么是神經元:
其中,x1、x2、x3代表輸入,中間部分為神經元,而最后的hw,b(x)是神經元的輸出。整個過程可以理解為輸入——>處理——>輸出。由多個神經元組成的就是神經網絡,如下圖所示,這是一個4層結構的神經網絡,layer1為輸入層,layer4為輸出層,layer2,layer3為隱藏層,即神經網絡的結構由輸入層,隱藏層,輸出層構成。其中除了輸入層以外,每一層的輸入都是上一層的輸出。
?典型的神經網絡具有以下三個部分:
(1)結構 (Architecture) 結構指定了網絡中的變量和它們的拓撲關系。例如,神經網絡中的變量可以是神經元連接的權重(weights)和神經元的激勵值(activities of the neurons)。
(2)激勵函數(Activity Rule) 大部分神經網絡模型具有一個短時間尺度的動力學規則,來定義神經元如何根據其他神經元的活動來改變自己的激勵值。一般激勵函數依賴于網絡中的權重(即該網絡的參數)。
(3)學習規則(Learning Rule)學習規則指定了網絡中的權重如何隨著時間推進而調整。這一般被看做是一種長時間尺度的動力學規則。一般情況下,學習規則依賴于神經元的激勵值。它也可能依賴于監督者提供的目標值和當前權重的值。
【實驗環境】
Ubuntu 16.04
Anaconda 4.3
python 3.6
Pycharm(Community)
【實驗內容】
本次實驗任務通過編寫Python代碼實現一個簡單的2維平面神經網絡分類器,去分割平面上的不同類別樣本點。
【實驗步驟】
1.打開Pycharm,新建項目,項目位置名稱:/data/Test。
2.在項目名Test下,創建Python File文件。
3.創建以NN命名的文件。
?4.在新創建的NN.py文件中,編寫代碼實現神經網絡算法。
(1)首先準備數據,生成一份螺旋狀分布的樣本點。
view plain?copy
N?=?100??
D?=?2??
K?=?3??
X?=?np.zeros((N*K,D))??
y?=?np.zeros(N*K,?dtype='uint8')??
for?j?in?range(K):??
??ix?=?range(N*j,N*(j+1))??
??r?=?np.linspace(0.0,1,N)??
??t?=?np.linspace(j*4,(j+1)*4,N)?+?np.random.randn(N)*0.2??
??X[ix]?=?np.c_[r*np.sin(t),?r*np.cos(t)]??
??y[ix]?=?j??
(2)單隱藏層的神經網絡,2層權重和偏移量。
view plain?copy
#?初始化參數??
h?=?100?#?隱層大小(神經元個數)??
W1?=?0.01?*?np.random.randn(D,h)??
b1?=?np.zeros((1,h))??
W2?=?0.01?*?np.random.randn(h,K)??
b2?=?np.zeros((1,K))??
(3)2層神經網絡的前向計算,使用ReLU神經單元。首先計算第一層神經網絡結果,然后作為第二層的輸入,計算最后的結果。
view plain?copy
hidden_layer?=?np.maximum(0,?np.dot(X,?W1)?+?b1)?#?用的?ReLU單元??
scores?=?np.dot(hidden_layer,?W2)?+?b2??
(4)梯度回傳與反向傳播,對W2和b2的第一次計算。
view plain?copy
dW2?=?np.dot(hidden_layer.T,?dscores)??
db2?=?np.sum(dscores,?axis=0,?keepdims=True)??
(5)計算hidden_layer的梯度。
view plain?copy
dhidden?=?np.dot(dscores,?W2.T)??
(6)梯度回傳經過ReLU,回傳的梯度大于0的時候,經過ReLU之后,保持原樣;如果小于0,本次回傳就到此結束。
view plain?copy
dhidden[hidden_layer?<=?0]?=?0??
(7)回到第一層,得到總的權重和偏移量的梯度。
view plain?copy
dW?=?np.dot(X.T,?dhidden)db?=?np.sum(dhidden,?axis=0,?keepdims=True)??
(8)可視化數據和現在的決策邊界。
view plain?copy
h?=?0.02??
x_min,?x_max?=?X[:,?0].min()?-?1,?X[:,?0].max()?+?1??
y_min,?y_max?=?X[:,?1].min()?-?1,?X[:,?1].max()?+?1??
xx,?yy?=?np.meshgrid(np.arange(x_min,?x_max,?h),??
?????????????????????np.arange(y_min,?y_max,?h))??
Z?=?np.dot(np.maximum(0,?np.dot(np.c_[xx.ravel(),?yy.ravel()],?W1)?+?b1),?W2)?+?b2??
Z?=?np.argmax(Z,?axis=1)??
Z?=?Z.reshape(xx.shape)??
fig?=?plt.figure()??
plt.contourf(xx,?yy,?Z,?cmap=plt.cm.Spectral,?alpha=0.8)??
plt.scatter(X[:,?0],?X[:,?1],?c=y,?s=40,?cmap=plt.cm.Paired?,marker='*')??
plt.xlim(xx.min(),?xx.max())??
plt.ylim(yy.min(),?yy.max())??
plt.show()??
完整代碼如下:
view plain?copy
import?numpy?as?np??
import?matplotlib.pyplot?as?plt??
N?=?100??
D?=?2??
K?=?3??
X?=?np.zeros((N*K,D))??
y?=?np.zeros(N*K,?dtype='uint8')??
for?j?in?range(K):??
??ix?=?range(N*j,N*(j+1))??
??r?=?np.linspace(0.0,1,N)??
??t?=?np.linspace(j*4,(j+1)*4,N)?+?np.random.randn(N)*0.2??
??X[ix]?=?np.c_[r*np.sin(t),?r*np.cos(t)]??
??y[ix]?=?j??
plt.scatter(X[:,?0],?X[:,?1],?c=y,?s=40,?cmap=plt.cm.Paired?,marker='*')??
plt.show()??
h?=?100??
W1?=?0.01?*?np.random.randn(D,?h)??
b1?=?np.zeros((1,?h))??
W2?=?0.01?*?np.random.randn(h,?K)??
b2?=?np.zeros((1,?K))??
step_size?=?1e-0??
reg?=?1e-3??
num_examples?=?X.shape[0]??
for?i?in?range(10000):??
????hidden_layer?=?np.maximum(0,?np.dot(X,?W1)?+?b1)??
????scores?=?np.dot(hidden_layer,?W2)?+?b2??
????exp_scores?=?np.exp(scores)??
????probs?=?exp_scores?/?np.sum(exp_scores,?axis=1,?keepdims=True)??
????corect_logprobs?=?-np.log(probs[range(num_examples),?y])??
????data_loss?=?np.sum(corect_logprobs)?/?num_examples??
????reg_loss?=?0.5?*?reg?*?np.sum(W1?*?W1)?+?0.5?*?reg?*?np.sum(W2?*?W2)??
????loss?=?data_loss?+?reg_loss??
????if?i?%?1000?==?0:??
????????print?("iteration?%d:?loss?%f"?%?(i,?loss))??
????dscores?=?probs??
????dscores[range(num_examples),?y]?-=?1??
????dscores?/=?num_examples??
????dW2?=?np.dot(hidden_layer.T,?dscores)??
????db2?=?np.sum(dscores,?axis=0,?keepdims=True)??
????dhidden?=?np.dot(dscores,?W2.T)??
????dhidden[hidden_layer?<=?0]?=?0??
????dW?=?np.dot(X.T,?dhidden)??
????db?=?np.sum(dhidden,?axis=0,?keepdims=True)??
????dW2?+=?reg?*?W2??
????dW?+=?reg?*?W1??
????W1?+=?-step_size?*?dW??
????b1?+=?-step_size?*?db??
????W2?+=?-step_size?*?dW2??
????b2?+=?-step_size?*?db2??
hidden_layer?=?np.maximum(0,?np.dot(X,?W1)?+?b1)??
scores?=?np.dot(hidden_layer,?W2)?+?b2??
predicted_class?=?np.argmax(scores,?axis=1)??
print('training?accuracy:?%.2f'?%?(np.mean(predicted_class?==?y)))??
h?=?0.02??
x_min,?x_max?=?X[:,?0].min()?-?1,?X[:,?0].max()?+?1??
y_min,?y_max?=?X[:,?1].min()?-?1,?X[:,?1].max()?+?1??
xx,?yy?=?np.meshgrid(np.arange(x_min,?x_max,?h),??
?????????????????????np.arange(y_min,?y_max,?h))??
Z?=?np.dot(np.maximum(0,?np.dot(np.c_[xx.ravel(),?yy.ravel()],?W1)?+?b1),?W2)?+?b2??
Z?=?np.argmax(Z,?axis=1)??
Z?=?Z.reshape(xx.shape)??
fig?=?plt.figure()??
plt.contourf(xx,?yy,?Z,?cmap=plt.cm.Spectral,?alpha=0.8)??
plt.scatter(X[:,?0],?X[:,?1],?c=y,?s=40,?cmap=plt.cm.Paired?,marker='*')??
plt.xlim(xx.min(),?xx.max())??
plt.ylim(yy.min(),?yy.max())??
plt.show()??
4.右鍵,選擇Run 'NN',運行程序。
?運行結果如下:
分類前散點圖:
使用構建后的神經網絡分類后的散點圖:
end
總結
以上是生活随笔為你收集整理的神经网络变学习率算法代码_机器学习算法之神经网络的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: kettle kafka mysql_k
- 下一篇: mysql怎么禁止远程连接_mysql禁