2018年1月1日 星期一

Python Deep Learning 深學筆記 - Python 實作 3 棧 ê 神經網路



請共教育部閩南語常用辭典開--咧,隨時會當查。
若是英文, 我會用斜體, 來表示


完整 ê 網路數學式

咱佇前一篇知影: 神經網路 ê 訊息, 是一棧一棧傳落去. 頂一棧和下一棧中方, 是 Matrix (台羅:
Mé-tshui ) ê Dot (台羅: tot) 運算. 佇遐, 為著予 dot ê 觀念會當清楚浮--起來, 我有減省 bias (台羅:Pài-o-sù)戛火函式, 這馬愛共伊添--轉去. 咱這馬看完整ê圖:



佇逐个神經元輸出ê時, 愛先經過戛火函式. 逐擺行到下一棧, 除了 Matrix ê dot 運算,閣有一个 bias (紅色) 愛添落. 這馬 0.5, -0.1, 0.2 只是用來做例表示伊是常數, 毋是一定是按呢!

較愛注意个是: 上尾欲輸出 ê 時, 彼咧戛火函式有可能和進前無仝. 這是因為欲用佗一个戛火函式, 愛看你想欲解決啥乜問題. 這馬我閣無啥乜經驗, 咱先 kā 這做法囥佇心肝頭, 後擺才閣沓沓仔來了解.

咱用前一篇學著 ê dot 表示法來表示這張圖:

X ● W1 + B1 = A1
h(A1) = Z1

Z1 ● W2 + B2 = A2
h(A2) = Z2

Z2 ● W3 + B3 = A3
σ(A3) = Y

其實, 就是重複三擺 dot, 加 bias, 閣用戛火函式處理這咧過程, 咱這馬會使開始寫阿!


頭一版 ê Python 實作

若是照咱頂仔 ê 算式, 就是真直覺:

A1 = np.dot(X, W1) + B1
Z1 = sigmoid(A1)

A2 = np.dot(Z1, W2) + B2
Z2 = sigmoid(A2)

A3 = np.dot(Z2, W3) + B3
y = identity_function(A3)

其中,  sigmoid() 和 identity_function() 是戛火函式. 紲--落來, 就是賰定義 W1, W2, W3 這三个權重, B1, B2, B3 這三个 Pài-o-sù 就好阿!

咱較佮意 kā 權重和 Pái-o-sù 獨立出來佇一開始都寫好, 囥佇 init 函式內底, 下跤是完整 ê 例: network.py, 和原文 ê 仝款:


import numpy as np

def sigmoid(x):
    return 1 / ( 1 + np.exp(-x))

def identity_function(x):
    return x


def init_network():
    network = {}
    network[ 'W1' ] = np.array([[0.1, 0.3, 0.5], [0.2, 0.4, 0.6]])
    network[ 'B1' ] = np.array([0.1, 0.2, 0.3])
    network[ 'W2' ] = np.array([[0.1, 0.4], [0.2, 0.5] , [0.3,  0.6]])
    network[ 'B2' ] = np.array([0.1, 0.2])
    network[ 'W3' ] = np.array([[0.1, 0.3], [0.2, 0.4]])
    network[ 'B3' ] = np.array([0.1, 0.2])

    return network

def forward(network, x):
    W1, W2, W3 = network['W1'], network['W2'], network['W3']
    B1, B2, B3 = network['B1'], network['B2'], network['B3']

    A1 = np.dot(x, W1) + B1
    Z1 = sigmoid(A1)

    A2 = np.dot(Z1, W2) + B2
    Z2 = sigmoid(A2)

    A3 = np.dot(Z2, W3) + B3
    y = identity_function(A3)

    return y

network = init_network()
x = np.array([1.0, 0.5])
y = forward(network, x)
print(y)

forward() 這个函式名, 是講這種訊號行徙ê方式, 是向前(ǹg-tsîng). 日後, 咱會閣學著向後(ǹg-āu).

佇遮, 咱使用著 Python ê 字典 (dictionary), 咱會使去參考線頂个 Python Doc. 若有需要, 我才閣另外寫一篇來紹介.

network() 這个函式名, 伊內底 ê 數字, 就是咱現此時个神經網路!

小結

到今(kàu-tann), 咱uì一个簡單 ê 三棧神經網路, 咱會當知影:

  • 伊是一棧一棧傳訊號(sìn-hō)--ê. uì頂一棧到下一棧是 Matrix ê dot 運算
  • 咱關心个是輸入和輸出, 中方 ê 棧, 是隱藏 ê 棧
  • 利用 Python ê NumPy, 欲寫出神經網路 ê 向前處理 (forward process), 毋但看起來屧貼, 好寫好理解. 伊運行起來嘛真好效率. 這是因為伊佇處理陣列 ê 運算真!



沒有留言:

佇 Linux 來看GPX 檔案

最近定定有戶外活動。使用𤆬路機 (GPS) 來記錄行過的路線。普通我記錄路線,攏是用手機仔抑是專門个𤆬路機,罕得用電腦來看。 毋過,"仙人拍鼓有時錯,跤步踏差啥人無"。有一擺我無細膩,袂記得共一擺活動的路線收煞起來,閣直接開始記錄下一擺的活動,按呢共幾落...