使用python構建三層神經網絡、softmax函數

_jym 2022-01-07 14:45:20 阅读数:732

使用 python softmax

輸入層到第一層的傳遞錶示

首先看輸入層到第一層的第一個神經元的信號傳遞過程:

在這裏插入圖片描述

可以用數學式子錶示第一層的第一個神經元的值:

在這裏插入圖片描述

如果用矩陣乘法運算,第一層的加權和可以錶示成下面形式:

在這裏插入圖片描述

考慮激活函數的話,也就是這樣一個代碼錶示形式:其中A1就包含了第一層所有節點的加權值。加權值帶入到激活函數裏得到的Z1是下一層的輸入。

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

第一層到第二層的傳遞錶示

第一層到第二層的信號傳遞過程圖如下:

在這裏插入圖片描述

同理可以寫出這個傳遞的代碼錶示形式:無非是把Z1作為輸入。

a2 = np.dot(z1, W2) + b2
z2 = sigmoid(a2)

第二層到第三層的傳遞錶示

第二層到第三層的信號傳遞過程圖如下:

在這裏插入圖片描述

可以寫出這個傳遞的代碼錶示形式:

a3 = np.dot(z2, W3) + b3
y = softmax(a3)
# 或者y = a3

這裏面加權和不是放到類似前面的激活函數裏面。

輸出層的激活函數,回歸問題用恒等函數,分類問題用softmax函數。

輸出層激活函數是恒等函數,則輸入信號會原封不動的輸出。

softmax函數的數學錶示:

在這裏插入圖片描述

softmax函數輸出是0-1之間的實數,並且softmax函數輸出值總和是1,這樣的話,可以把softmax函數的輸出解釋成概率。即便使用了softmax函數,各個元素之間的大小關系不會改變。

由於softmax函數要進行指數運算,指數函數的值可能會很大,導致溢出問題。

在這裏插入圖片描述

可以把分子分母都乘以C,然後我們把公式變成了exp(ak+c),如果c是輸入信號中的最大值,那麼公式裏面减去c之後,就不會溢出了。

它的代碼實現為:

def softmax(a):
c = np.max(a)
exp_a = np.exp(a-c)#防溢出
sum_exp_a = np.sum(exp_a)
y = exp_a/sum_exp_a
return y

全過程傳遞錶示代碼

代碼如下,其中x是輸入的圖像數據。W1, W2, W3分別代錶第1、2、3層的所有權重, b1, b2, b3分別代錶第1、2、3層的所有偏置,默認我們的network已經訓練好了權重和偏置的值。

def predict(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 = softmax(a3)
return y
版权声明:本文为[_jym]所创,转载请带上原文链接,感谢。 https://gsmany.com/2022/01/202201071445203898.html