從零開始深度學習搭建神經網路(一)

2021-08-07 18:13:11 字數 1795 閱讀 2441

人工智慧不神秘,會一點加減乘除就夠了。

對於神經元來說,當神經受到刺激的時候,會釋放神經遞質傳給下乙個神經元,不同程度的刺激對下乙個神經元釋放的神經遞質的量也不同,所以模仿這個過程建立神經網路:

當輸入乙個資料x的時候,模擬輸入乙個外界刺激,經過處理後,輸出的結果為f(x),把這個f(x)傳給下乙個神經元,逐步求解,最終輸出乙個值z,與給定的值進行對比(有監督學習),根據結果調整每個的神經元內部函式的引數,稱為反向擴散,然後在下一輪來重複這個過程,直到達到指定迭代次數,通過不斷調整引數以接近損失(lost)最小的點。

可以看出,輸出的值z應該具有乙個範圍,比如識別一組是否為貓,則在訓練樣例中,結果應該是0或者1,那麼輸出也應該對應為0或1,所以需要對映到0/1上。而如果分類數增加,那麼範圍也應該相應擴大。

所以,舉例進行學習:

輸入為x,例如一張,畫素為34*34pixels,那麼根據rgb成色原理,共有34*34*3個資料,所以將x對映為乙個(34*34*3, 1)的矩陣(一般採用w的轉置矩陣,即wt),按照r(34*34),g(34*34),b(34*34)進行排列。

下一步需要確定f(x)函式,先採取比較簡單的線性(一次)神經網路,比較常見的一元一次方程形式為f(x)= ax+b,所以採用類似的形式:

f(x) = w*x + b

其中,w為weight權重,b為bias偏差,即學習調整引數,也就是調整w和b的值。

注意:矩陣相乘對矩陣的大小是有要求的,在這裡x的規格為(34*34*3, 1),所以w的列數也應該為34*34*3,如果我們只有一層神經元,那麼f(x)就是乙個數,即(1, 1)的矩陣,所以此處w的大小應為(1, 34*34*3),b僅僅是乙個常數。

將變數對映到

0,1之間

,選擇這個方程的原因是求導容易, s』(x) = s(x) / (1 – s(x)).

評價引數是否合理也需要乙個方程,即損失方程(loss),表示的含義為**值與標準(監督)值之間的偏差,盡量減小這個偏差來達到更好的**(分類)效果,比較常用的損失方程為:

定義,a為**值,y為準確值。

l(a, y)= -y * log(a)- (1 - y) * log (1 - a)

如果有m個訓練樣例的話,平均損失函式為值加起來後除以m,即

l = sum(li) / m

計算完cost後需要調整w和b的值,因為我們需要cost的值減小,所以需要對l方程求導獲取梯度值(gradient),逐步朝著最小值前進,此處』dw』、』db』均為方便在python**中進行表示,實際含義為右側等式(求的是微分):

『dw』 = dj/dw = (dj/dz)*(dz/dw)= x*(a-y)t / m

『db』 = dj/db = sum(a-y) / m

所以新的值為:

w = w – α * dw

b = b – α * db,其中 α 為學習速率,在下一輪迭代中採用新的w、b。

設定迭代次數,迭代完畢後,就是最終得到的引數w, b,用測試用例來驗證識別準確率,一般應該在70%以上。

在我的博文「知乎爬蟲」中,會有關於爬取資料進行訓練的**編寫過程,目前僅需要明白神經網路流程即可。

具體的**在中的base_func.py,實現了簡單的神經網路,後續會增加更多神經元和優化速度。

從零開始深度學習搭建神經網路(二)

參考資料 coursera的andrewng deeplearning.ai課程 github 中的hidden func.py中 通過上一次的學習,我們已經能夠完成乙個簡單的神經網路,但如此簡單的神經網路在進行學習的時候準確率有限,因為每一次學習都相當於在圖中分割一刀,紅藍之間的分類顯然不是一刀可...

從零開始搭建深度學習環境

開始深度學習調參之路不能沒有乙個趁手的環境 安裝基礎環境 我使用的機器環境是 ubuntu18.04 安裝顯示卡驅動 1.2.按照cuda所需的版本安裝 3.sudo ubuntu drivers autoinstall 安裝pip sudo apt get install python pip 安...

機器學習,深度學習,神經網路,深度神經網路

先來說一下這幾者之間的關係 人工智慧包含機器學習,機器學習包含深度學習 是其中比較重要的分支 深度學習源自於人工神經網路的研究,但是並不完全等於傳統神經網路。所以深度學習可以說是在傳統神經網路基礎上的公升級。神經網路一般有輸入層 隱藏層 輸出層,一般來說隱藏層大於2的神經網路就叫做深度神經網路,深度...