
上圖從左到右依次是輸入層、隱藏層1、隱藏層2和輸出層。由于有權(quán)重的只有三層,故稱之為三層神經(jīng)網(wǎng)絡(luò)。 x1,x2表示整個(gè)神經(jīng)網(wǎng)絡(luò)的輸入信號(hào),y1,y2表示整個(gè)神經(jīng)網(wǎng)絡(luò)的輸出信號(hào)。內(nèi)含1的神經(jīng)元以及bij標(biāo)識(shí)是為了表示偏置,bij表示第i層偏置的第j個(gè)元素。 比較大的神經(jīng)元中aij表示它的輸入信號(hào),zij表示它的輸出信號(hào)。圖中的直線均表示從左到右的箭頭,各層權(quán)重的具體數(shù)據(jù)沒有在箭頭上表示出來,但它們是存在的。aij就是指向它所有箭頭所表示的加權(quán)和,將aij經(jīng)過激活函數(shù)轉(zhuǎn)化就得到zij。 將輸入信號(hào)x1,x2通過如圖三層神經(jīng)網(wǎng)絡(luò)的推理處理,就可以得到該神經(jīng)網(wǎng)絡(luò)的推理結(jié)果y1,y2。 # 2.三層神經(jīng)網(wǎng)絡(luò)推理過程的實(shí)現(xiàn)以及解析import numpy as np
from sigmoid import sigmoid # 從sigmoid.py文件中導(dǎo)入sigmoid函數(shù)
from identity import identity_function # 從identity.py文件中導(dǎo)入identity_function函數(shù)
#三層神經(jīng)網(wǎng)絡(luò)的實(shí)現(xiàn)
#初始化函數(shù)
def init_network():
network={} #定義一個(gè)字典變量network
network['W1']=np.array([[0.1,0.3,0.5],[0.2,0.4,0.6]]) #定義標(biāo)記W1為一個(gè)二維數(shù)組,表示神經(jīng)網(wǎng)絡(luò)第一層的權(quán)重
network['b1']=np.array([0.1,0.2,0.3]) #定義標(biāo)記b1為一個(gè)一維數(shù)組,表示神經(jīng)網(wǎng)絡(luò)第一層的偏置
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 #返回字典變量network
#推理函數(shù)
def predict(network,x): #推理函數(shù)的入口參數(shù)為一個(gè)字典變量和一個(gè)輸入層信號(hào)數(shù)組
W1,W2,W3=network['W1'],network['W2'],network['W3'] #通過已知的字典變量定義各層權(quán)重和偏置
b1,b2,b3=network['b1'],network['b2'],network['b3']
a1=np.dot(x,W1) b1 #計(jì)算加權(quán)和a1(即信號(hào)矩陣x與第一層權(quán)重矩陣W1相乘,再加上第一層偏置矩陣b1)
z1=sigmoid(a1) #將加權(quán)和a1通過激活函數(shù)sigmoid轉(zhuǎn)換,得到隱藏層1的輸出信號(hào)數(shù)組z1
a2=np.dot(z1,W2) b2 #計(jì)算加權(quán)和a2(即信號(hào)矩陣z1與第二層權(quán)重矩陣W2相乘,再加上第二層偏置矩陣b2)
z2=sigmoid(a2) #將加權(quán)和a2通過激活函數(shù)sigmoid轉(zhuǎn)換,得到隱藏層2的輸出信號(hào)數(shù)組z2
a3=np.dot(z2,W3) b3 #計(jì)算加權(quán)和a3(即信號(hào)數(shù)組z2與輸出層權(quán)重矩陣W3相乘,再加上輸出層偏置矩陣b3)
y=identity_function(a3) #將加權(quán)和a3通過輸出層激活函數(shù)identity_function轉(zhuǎn)換,得到輸出層的輸出信號(hào)數(shù)組y
return y #返回三層神經(jīng)網(wǎng)絡(luò)的輸出信號(hào)數(shù)組y
# 測試
network=init_network() #初始化字典變量
x=np.array([1.0,0.5]) #定義輸入信號(hào)數(shù)組
y=predict(network,x) #通過三層神經(jīng)網(wǎng)絡(luò)的推理函數(shù)計(jì)算輸出信號(hào)
print(y) #打印輸出信號(hào)數(shù)組
對(duì)應(yīng)測試結(jié)果: 
本例輸出層激活函數(shù)用的是恒等函數(shù),對(duì)應(yīng)回歸問題。對(duì)于輸入數(shù)據(jù)1.0的預(yù)測值是0.3168,對(duì)于輸入數(shù)據(jù)0.5的預(yù)測值是0.6963。 本博客參考了《深度學(xué)習(xí)入門——基于Python的理論與實(shí)現(xiàn)》(齋藤康毅著,陸宇杰譯),特在此聲明。
|