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