日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

【机器学习基础】数学推导+纯Python实现机器学习算法7:神经网络

發布時間:2025/3/8 python 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【机器学习基础】数学推导+纯Python实现机器学习算法7:神经网络 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Python機器學習算法實現

Author:louwill

? ? ?

???? 上一節中筆者和大家了解了感知機的基本原理及其Python實現。本節筆者將在感知機的基礎上繼續介紹神經網絡模型。從上一講我們知道,感知機是一種線性模型,對于非線性問題很難給出解決方案。

???? 比如咱們熟知的這種異或問題(XOR),就是一種典型的線性不可分問題,普通的感知機很難處理:

(來自周志華 機器學習)

???? 因此,在普通的感知機基礎上,我們對感知機結構進行了延申,通過添加隱藏層的方式來使得感知機能夠擬合非線性問題。這種包含隱藏層結構的感知機模型就是神經網絡,也叫多層感知機(Multilayer Perceptron)。

???? 關于神經網絡的眾多概念和知識:包括輸入層、隱藏層、輸出層、激活函數、前向傳播、反向傳播、梯度下降、權值更新等概念筆者不再贅述。在筆者的另一個系列推文——深度學習60講中有詳細介紹:深度學習第60講:深度學習筆記系列總結與感悟。

生成數據

???? 本節筆者以一個兩層網絡,即單隱層網絡為例,來看看如何利用numpy實現一個神經網絡模型。正式搭建神經網絡之前我們先來準備一下數據。定義一個數據生成函數:

def?create_dataset():np.random.seed(1)m = 400 # 數據量N = int(m/2) # 每個標簽的實例數D = 2 # 數據維度X = np.zeros((m,D)) # 數據矩陣Y = np.zeros((m,1), dtype='uint8') # 標簽維度a?=?4?for j in range(2):ix = range(N*j,N*(j+1))t = np.linspace(j*3.12,(j+1)*3.12,N) + np.random.randn(N)*0.2 # thetar = a*np.sin(4*t) + np.random.randn(N)*0.2 # radiusX[ix] = np.c_[r*np.sin(t), r*np.cos(t)]Y[ix] = jX = X.TY = Y.Treturn X, Y

???? 數據可視化展示如下:

???? 繼續回顧一下搭建一個神經網絡的基本思路和步驟:

  • 定義網絡結構(指定輸出層、隱藏層、輸出層的大小)

  • 初始化模型參數

  • 循環操作:執行前向傳播/計算損失/執行后向傳播/權值更新

定義網絡結構

???? 假設X為神經網絡的輸入特征矩陣,y為標簽向量。則含單隱層的神經網絡的結構如下所示:

????網絡結構的函數定義如下:

def layer_sizes(X, Y):n_x = X.shape[0] # 輸入層大小n_h = 4 # 隱藏層大小n_y = Y.shape[0] # 輸出層大小return?(n_x,?n_h,?n_y)

????其中輸入層和輸出層的大小分別與X和 y的shape有關。而隱層的大小可由我們手動指定。這里我們指定隱層的大小為4。

初始化模型參數

????假設W1為輸入層到隱層的權重數組、b1為輸入層到隱層的偏置數組;W2為隱層到輸出層的權重數組,b2為隱層到輸出層的偏置數組。于是我們定義參數初始化函數如下:

def initialize_parameters(n_x, n_h, n_y):W1 = np.random.randn(n_h, n_x)*0.01b1 = np.zeros((n_h, 1))W2 = np.random.randn(n_y, n_h)*0.01b2 = np.zeros((n_y, 1)) assert (W1.shape == (n_h, n_x)) assert (b1.shape == (n_h, 1)) assert (W2.shape == (n_y, n_h)) assert (b2.shape == (n_y, 1))parameters = {"W1": W1, "b1": b1, "W2": W2, "b2": b2} return parameters

????其中對權值的初始化我們利用了numpy中的生成隨機數的模塊np.random.randn,偏置的初始化則使用了 np.zeros模塊。通過設置一個字典進行封裝并返回包含初始化參數之后的結果。

前向傳播

????在定義好網絡結構并初始化參數完成之后,就要開始執行神經網絡的訓練過程了。而訓練的第一步則是執行前向傳播計算。假設隱層的激活函數為tanh函數, 輸出層的激活函數為sigmoid函數。則前向傳播計算表示為:

????定義前向傳播計算函數為:

def forward_propagation(X, parameters):# 獲取各參數初始值W1 = parameters['W1']b1 = parameters['b1']W2 = parameters['W2']b2 = parameters['b2'] # 執行前向計算Z1 = np.dot(W1, X) + b1A1 = np.tanh(Z1)Z2 = np.dot(W2, A1) + b2A2 = sigmoid(Z2) assert(A2.shape == (1, X.shape[1]))cache = {"Z1": Z1, "A1": A1, "Z2": Z2, "A2": A2} return A2, cache

???? 從參數初始化結果字典里取到各自的參數,然后執行一次前向傳播計算,將前向傳播計算的結果保存到cache這個字典中, 其中A2為經過sigmoid激活函數激活后的輸出層的結果。

計算當前訓練損失

???? 前向傳播計算完成后我們需要確定以當前參數執行計算后的的輸出與標簽值之間的損失大小。與筆記1一樣,損失函數同樣選擇為交叉熵損失:

? ? ?定義計算損失函數為:

def compute_cost(A2, Y, parameters):# 訓練樣本量m = Y.shape[1] # 計算交叉熵損失logprobs = np.multiply(np.log(A2),Y) + np.multiply(np.log(1-A2), 1-Y)cost = -1/m * np.sum(logprobs)# 維度壓縮cost = np.squeeze(cost) assert(isinstance(cost, float)) return cost
執行反向傳播

???? 當前向傳播和當前損失確定之后,就需要繼續執行反向傳播過程來調整權值了。中間涉及到各個參數的梯度計算,具體如下圖所示:

????根據上述梯度計算公式定義反向傳播函數:

def backward_propagation(parameters, cache, X, Y):m = X.shape[1] # 獲取W1和W2W1 = parameters['W1']W2 = parameters['W2'] # 獲取A1和A2A1 = cache['A1']A2 = cache['A2'] # 執行反向傳播dZ2 = A2-YdW2 = 1/m * np.dot(dZ2, A1.T)db2 = 1/m * np.sum(dZ2, axis=1, keepdims=True)dZ1 = np.dot(W2.T, dZ2)*(1-np.power(A1, 2))dW1 = 1/m * np.dot(dZ1, X.T)db1 = 1/m * np.sum(dZ1, axis=1, keepdims=True)grads = {"dW1": dW1,"db1": db1, "dW2": dW2, "db2": db2} return grads

???? 將各參數的求導計算結果放入字典grad進行返回。

???? 這里需要提一下的是涉及到的關于數值優化方面的知識。在機器學習中,當所學問題有了具體的形式之后,機器學習就會形式化為一個求優化的問題。不論是梯度下降法、隨機梯度下降、牛頓法、擬牛頓法,抑或是 Adam 之類的高級的優化算法,這些都需要花時間掌握去掌握其數學原理。

權值更新

???? 迭代計算的最后一步就是根據反向傳播的結果來更新權值了,更新公式如下:

???? 由該公式可以定義權值更新函數為:

def update_parameters(parameters, grads, learning_rate=1.2):# 獲取參數W1 = parameters['W1']b1 = parameters['b1']W2 = parameters['W2']b2 = parameters['b2'] # 獲取梯度dW1 = grads['dW1']db1 = grads['db1']dW2 = grads['dW2']db2 = grads['db2'] # 參數更新W1 -= dW1 * learning_rateb1 -= db1 * learning_rateW2 -= dW2 * learning_rateb2 -= db2 * learning_rateparameters = {"W1": W1, "b1": b1, "W2": W2, "b2": b2} return parameters

???? 這樣,前向傳播-計算損失-反向傳播-權值更新的神經網絡訓練過程就算部署完成了。當前了,跟之前幾講一樣,為了更加pythonic一點,我們也將各個模塊組合起來,定義一個神經網絡模型:

def nn_model(X, Y, n_h, num_iterations=10000, print_cost=False):np.random.seed(3)n_x = layer_sizes(X, Y)[0]n_y = layer_sizes(X, Y)[2] # 初始化模型參數parameters = initialize_parameters(n_x, n_h, n_y)W1 = parameters['W1']b1 = parameters['b1']W2 = parameters['W2']b2 = parameters['b2'] # 梯度下降和參數更新循環for i in range(0, num_iterations): # 前向傳播計算A2, cache = forward_propagation(X, parameters) # 計算當前損失cost = compute_cost(A2, Y, parameters) # 反向傳播grads = backward_propagation(parameters, cache, X, Y) # 參數更新parameters = update_parameters(parameters, grads, learning_rate=1.2) # 打印損失if print_cost and i % 1000 == 0: print ("Cost after iteration %i: %f" %(i, cost)) return parameters

???? 模型主體完成之后也可以再定義一個基于訓練結果的預測函數:

def?predict(parameters,?X):?A2, cache = forward_propagation(X, parameters)predictions?=?(A2>0.5)return predictions

?????

???? 下面我們便基于之前生成的數據來測試一下模型:

parameters = nn_model(X, Y, n_h = 4, num_iterations=10000,?print_cost=True)

???? 經過9000次迭代后損失下降到了0.21。我們再來看一下測試預測準確率:

# 預測準確率 predictions = predict(parameters, X) print ('Accuracy: %d' % float((np.dot(Y,predictions.T) + np.dot(1-Y,1-predictions.T))/float(Y.size)*100) + '%')

???? 測試準確率達到0.9。

???? 繪制神經網絡的決策邊界效果如下:

???? 以上便是本節的主要內容,利用numpy手動搭建一個單隱層的神經網路。本例來自于Andrew NG deeplearningai深度學習系列課程第一門課的assignment3,感興趣的朋友可查找相關資料進行學習。完整代碼文件和數據可參考我的GitHub地址:

https://github.com/luwill/machine-learning-code-writing

參考資料:

https://www.deeplearning.ai/

往期精彩:

數學推導+純Python實現機器學習算法6:感知機

數學推導+純Python實現機器學習算法5:決策樹之CART算法

數學推導+純Python實現機器學習算法4:決策樹之ID3算法

數學推導+純Python實現機器學習算法3:k近鄰

數學推導+純Python實現機器學習算法2:邏輯回歸

數學推導+純Python實現機器學習算法1:線性回歸


往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習及深度學習筆記等資料打印機器學習在線手冊深度學習筆記專輯《統計學習方法》的代碼復現專輯 AI基礎下載機器學習的數學基礎專輯獲取一折本站知識星球優惠券,復制鏈接直接打開:https://t.zsxq.com/yFQV7am本站qq群1003271085。加入微信群請掃碼進群:

總結

以上是生活随笔為你收集整理的【机器学习基础】数学推导+纯Python实现机器学习算法7:神经网络的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。