使用python自己搭建一个简单的BP神经网络
生活随笔
收集整理的這篇文章主要介紹了
使用python自己搭建一个简单的BP神经网络
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
from numpy import exp,array,random,dot
#import randomclass NeuralNetwork(object):def __init__(self):#指定隨機(jī)數(shù)發(fā)生器種子,保證每次獲得相同結(jié)果的隨機(jī)數(shù)random.seed(1)#對(duì)含有3輸入1輸出的單個(gè)神經(jīng)元建模#即3*1矩陣賦予隨機(jī)權(quán)重值,范圍(-1,1)#即(a,b)范圍的c*d矩陣隨機(jī)數(shù)為(b-a)*random.random((c,d))+aself.dendritic_weights=2*random.random((3,1))-1#sigmoid函數(shù),s型曲線,用于對(duì)輸入的加權(quán)總和x做(0,1)正規(guī)化#它可以將一個(gè)實(shí)數(shù)映射到(0,1)空間def __sigmoid(self,x):return 1/(1+exp(-x))#sigmoid函數(shù)的導(dǎo)數(shù)#這里的x是指__sigmoid函數(shù)的輸出def __sigmoid_derivative(self,x):return x*(1-x)#訓(xùn)練該神經(jīng)網(wǎng)絡(luò),并調(diào)整樹突的權(quán)重def train(self,training_inputs,training_output,number_of_training_iteration):'''training_inputs:訓(xùn)練集的樣本輸入training_outputs:訓(xùn)練集樣本的輸出number_of_training_iteration:訓(xùn)練次數(shù)1.我們使用sigmoid曲線計(jì)算(輸入的加權(quán)和映射到0至1之間)作為輸出神經(jīng)元2.如果輸出是一個(gè)大的正(或負(fù))數(shù),這意味著神經(jīng)元采用這種(或另一種)方式3.從sigmoid曲線可以看出,在較大值處,sigmoid曲線的斜率小,即認(rèn)為當(dāng)前權(quán)重是正確4.所以,乘以sigmoid函數(shù)曲線斜率可以進(jìn)行調(diào)整'''for _iteration in range(number_of_training_iteration):#訓(xùn)練集導(dǎo)入神經(jīng)網(wǎng)絡(luò)output=self.think(training_inputs)#計(jì)算誤差error=training_output-output#將誤差乘以輸入,再乘以s型曲線的梯度adjustment=dot(training_inputs.T,error*self.__sigmoid_derivative(output))self.dendritic_weights+=adjustment#神經(jīng)網(wǎng)絡(luò)def think(self,inputs):#輸入與權(quán)重相乘并正交化return self.__sigmoid(dot(inputs,self.dendritic_weights))if __name__=='__main__':#初始化神經(jīng)網(wǎng)絡(luò)nn=NeuralNetwork()#初始化權(quán)重print("初始樹突權(quán)重:\n{}".format(nn.dendritic_weights))#訓(xùn)練集,四個(gè)樣本,每個(gè)樣本有3個(gè)輸入,1個(gè)輸出#訓(xùn)練樣本輸入training_inputs_sample=array([[0,0,1],[1,1,1],[1,0,1],[0,1,1]])#訓(xùn)練樣本的輸出training_outputs_sample=array([[0,1,1,0]]).T#用訓(xùn)練集訓(xùn)練nn,重復(fù)十萬次,每次做微小的調(diào)整nn.train(training_inputs_sample,training_outputs_sample,100000)#訓(xùn)練后的樹突權(quán)重print("訓(xùn)練后樹突權(quán)重:\n{}".format(nn.dendritic_weights))#用新數(shù)據(jù)進(jìn)行測(cè)試test_result=nn.think(array([1,0,0]))print("測(cè)試結(jié)果:\n{}".format(test_result))
程序運(yùn)行結(jié)果:
初始樹突權(quán)重: [[-0.16595599][ 0.44064899][-0.99977125]] 訓(xùn)練后樹突權(quán)重: [[12.00870061][-0.2044116 ][-5.8002822 ]] 測(cè)試結(jié)果: [0.99999391]參考資料:python嘗試自己寫一個(gè)簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò)
總結(jié)
以上是生活随笔為你收集整理的使用python自己搭建一个简单的BP神经网络的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python---modules(模块)
- 下一篇: 学习记录1-python图片分割tran