神经网络Python实现(9行代码)
1.?神經(jīng)網(wǎng)絡(luò)簡介
神經(jīng)網(wǎng)絡(luò)由輸入層、輸出層和之間若干層(一層或多層)隱含層構(gòu)成,每一層可以有若干個(gè)節(jié)點(diǎn)。層與層之間節(jié)點(diǎn)的連接狀態(tài)通過權(quán)重來體現(xiàn)。
?下面介紹一下單個(gè)神經(jīng)元:
輸入節(jié)點(diǎn):x1,x2
權(quán)重:w1,w2
偏置:b
激活函數(shù):h()
輸出結(jié)果:y
a = x1*w1 + x2*w2 + b
?2. 代碼解釋
這段代碼是在GitHub上找到的,鏈接如下:
https://github.com/miloharper/simple-neural-network
作者這樣描述這段代碼:
A neural network written in Python, consisting of a single neuron that uses gradient descent to learn.
一種用Python編寫的神經(jīng)網(wǎng)絡(luò),它是由一個(gè)使用梯度下降學(xué)習(xí)的神經(jīng)元組成。
from numpy import exp, array, random, dot training_set_inputs = array([[0, 0, 1], [1, 1, 1], [1, 0, 1], [0, 1, 1]]) training_set_outputs = array([[0, 1, 1, 0]]).T random.seed(1) synaptic_weights = 2 * random.random((3, 1)) - 1 for iteration in range(10000):output = 1 / (1 + exp(-(dot(training_set_inputs, synaptic_weights))))synaptic_weights += dot(training_set_inputs.T, (training_set_outputs - output) * output * (1 - output)) print( 1 / (1 + exp(-(dot(array([1, 0, 0]), synaptic_weights)))))① from numpy import exp, array, random, dot
#從Numpy庫中調(diào)用exp(指數(shù)函數(shù))、array(數(shù)組)、random(隨機(jī)函數(shù))、dot(矩陣相乘函數(shù))
② training_set_inputs = array([[0, 0, 1], [1, 1, 1], [1, 0, 1], [0, 1, 1]])
#神經(jīng)網(wǎng)絡(luò)訓(xùn)練部分的輸入
③ training_set_outputs = array([[0, 1, 1, 0]]).T
#神經(jīng)網(wǎng)絡(luò)訓(xùn)練部分的輸出,.T表示矩陣轉(zhuǎn)置
④ random.seed(1)
#使用隨機(jī)函數(shù)生成隨機(jī)數(shù)(這一行代碼可以省略,目的只是保證測(cè)試結(jié)果與作者一致)
⑤ synaptic_weights = 2 * random.random((3, 1)) – 1
⑥ for iteration in range(10000):
⑦? ?output = 1 / (1 + exp(-(dot(training_set_inputs, synaptic_weights))))
#使用for語句循環(huán)10000次,將訓(xùn)練集的輸入和權(quán)重采用.dot進(jìn)行矩陣相乘,將相乘得到的結(jié)果輸入到sigmoid函數(shù),然后將得到的結(jié)果賦值給output
⑧?? synaptic_weights += dot(training_set_inputs.T, (training_set_outputs - output) * output * (1 - output))
#權(quán)重的調(diào)整采用“誤差加權(quán)導(dǎo)數(shù)”公式(梯度下降)
⑨ print (1 / (1 + exp(-(dot(array([1, 0, 0]), synaptic_weights)))))?#[0.99993704]
#synaptic_weights是調(diào)整之后的最終權(quán)重,數(shù)組(矩陣)[1,0,0]與這個(gè)權(quán)重矩陣通過dot函數(shù)進(jìn)行相乘,將相乘的結(jié)果作為輸入引入到sigmoid函數(shù),得到最終的結(jié)果
這段代碼的模型如下圖所示,有三個(gè)輸入,一個(gè)輸出,簡單來說,神經(jīng)網(wǎng)絡(luò)就是一個(gè)通過訓(xùn)練集輸入的數(shù)據(jù)不斷地迭代更新權(quán)重的模型,使之輸出更接近“標(biāo)準(zhǔn)答案”,這里推薦看一下B站上的一個(gè)有關(guān)神經(jīng)網(wǎng)絡(luò)的短視頻:
一分鐘告訴你什么是神經(jīng)網(wǎng)絡(luò)
?這9行代碼就是把上圖的1~4組數(shù)據(jù)作為訓(xùn)練集進(jìn)行模型訓(xùn)練,不斷地更新權(quán)重使其輸出更接近訓(xùn)練集中給出的輸出標(biāo)簽(標(biāo)準(zhǔn)答案),然后將最后一組數(shù)據(jù)當(dāng)做測(cè)試集來檢測(cè)模型的準(zhǔn)確度,它最后的結(jié)果輸出是0.99993704,也是約等于1,其實(shí)不難發(fā)現(xiàn),4組測(cè)試數(shù)據(jù)的輸出都與第一個(gè)輸入數(shù)據(jù)相同,所以說神經(jīng)網(wǎng)絡(luò)模型測(cè)試得到了正確的結(jié)果,這也是說明神經(jīng)網(wǎng)絡(luò)有預(yù)測(cè)結(jié)果的作用。
總結(jié)
以上是生活随笔為你收集整理的神经网络Python实现(9行代码)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Cocos2dx 小技巧(一)预定义文件
- 下一篇: python 给定n个整数,请统计出每个