基于sympy的python实现三层BP神经网络算法
生活随笔
收集整理的這篇文章主要介紹了
基于sympy的python实现三层BP神经网络算法
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
寫一個三層的BP神經(jīng)網(wǎng)絡(luò)(3,2,1),3是輸入數(shù)據(jù)的維度,隱層設(shè)置節(jié)點數(shù)為2,1是因為每個觀測的target都是一個標量即只有一個數(shù);
1.隨機生成兩個隨機矩陣作為三個層之間的連接權(quán)值,注意矩陣大小設(shè)置;設(shè)定誤差閾值等參數(shù)
2.使用i=random.randint(0,len(x)-1)隨機產(chǎn)生一個樣品的輸入及target
3.使用權(quán)值w1,w2,sigmoid函數(shù)、diffsigmoid函數(shù)計算隱層和輸出層的輸入,輸出
4.利用上面的隨機樣品的實際輸出和期望輸出之差e,用e求偏導(dǎo)de/dwho、de/dwih
5.梯度下降法更新權(quán)值w1,w2
6.再次計算全局誤差,若滿足設(shè)定的誤差閾值,返回當前權(quán)值;否則重算
"""
print(__doc__)
import random
from sympy import *
import numpy as np
import pandas as pd
data=pd.read_csv("wenzi.csv",header='infer')
data=np.mat(data)
x=data[:, :3]
y=data[:, 3]#激活函數(shù)
def sigmoid(x):return ( 1/(1+np.exp(-x)) )
#激活函數(shù)的導(dǎo)函數(shù)
def diffsigmoid(x):return (1- 1/(1+np.exp(-x)) )*( 1/(1+np.exp(-x)) )def upgrade_w1_w2(): #i是隨機選取的一個樣本erro=0.01 #誤差n_iter=500 #迭代次數(shù)learnrate=0.1 #學習率global w1,w2,b1,b2
w1= 0.5 * np.random.rand(2,3) - 0.1
b1= 0.5 * np.random.rand(2,1) - 0.1
w2= 0.5 * np.random.rand(1,2) - 0.1
b2= 0.5 * np.random.rand(1,1) - 0.1"""
隨機抽取一個樣本計算兩個偏導(dǎo)de/dwih 、de/dwoh
"""
i=random.randint(0,len(x)-1)
obs =np.array(x[i] )hidden_input_1=np.dot(w1[0],obs.T) - b1[0]
hidden_input_2=w1[1].dot(obs.T)-b1[1]hidden_output_1=sigmoid(hidden_input_1)
hidden_output_2=sigmoid(hidden_input_2)hidden_output_array=[float(hidden_output_1),float(hidden_output_2)]outlayer_input=np.dot(w2[0] ,(hidden_output_array)) - b2[0] #輸出層只有一個節(jié)點
outlayer_output=sigmoid(outlayer_input)expect_output=y[i]
loss=expect_output - outlayer_output
sigma_t_k_1=-(expect_output-sigmoid(outlayer_input)) * diffsigmoid(outlayer_input)A=sigma_t_k_1 * hidden_output_array #de/dwho
print("sigma_t_k_1\n",sigma_t_k_1)
print('隱層的輸出向量',hidden_output_array )
a=np.array(sum(-(sigma_t_k_1)))print("sum(-(sigma_t_k_1)* w1) * obs",a*w1[0] * obs )B1=diffsigmoid(hidden_input_1) * a* w1[0] * obsB2=diffsigmoid(hidden_input_2) * a* w1[1] * obs"""
計算全局誤差
"""while True:for j in range(len(x)):obs =x[j]hidden_input_1=np.mat(w1[0]).dot(obs.T) - b1[0] #隱層第一個節(jié)點上的輸入hidden_input_2=np.mat(w1[1]).dot(obs.T) - b1[1] #隱層第二個節(jié)點上的輸入hidden_output_1=sigmoid(hidden_input_1) #隱層第一個節(jié)點上的輸出hidden_output_2=sigmoid(hidden_input_2) #隱層第二個節(jié)點上的輸出hidden_output_array=[float(hidden_output_1),float(hidden_output_2)]outlayer_input_1=w2[0].dot(hidden_output_array)-b2[0] #輸出層的輸入outlayer_output_1=sigmoid(outlayer_input_1) #輸入層的輸出expect_output=y[i] #期望輸出就是每個觀測的target數(shù)值totalloss= [] #建立空列表用以求和loss=expect_output - outlayer_output_1 #loss是每個觀測的期望輸出與實際輸出的差totalloss.append(loss) #totalloss=np.array(totalloss) #把列表轉(zhuǎn)化為數(shù)組才能進行點乘"""如果全局誤差大于閾值就要更新權(quán)重"""if 0.5*totalloss.dot(totalloss) > erro:print("誤差大于給定的閾值")new_w2_0=w2[0]-learnrate* (sigma_t_k_1 * hidden_output_array)new_w2=new_w2_0w2=new_w2new_w1_0=np.array(w1[0]-learnrate*B1)new_w1_1=np.array(w1[1]-learnrate*B2)w1=np.vstack((new_w1_0,new_w1_1))print("誤差大于閾值時的全局損失; ",0.5*totalloss.dot(totalloss))print("誤差大于閾值時的實際輸出",sigmoid(outlayer_output_1))print("誤差大于閾值時的w1權(quán)值矩陣:\n",w1)print("誤差大于閾值時的w2權(quán)值矩陣:\n",w2)"""如果全局誤差小于閾值就返回目前權(quán)"""if 0.5*totalloss.dot(totalloss)<= erro:print("\n誤差滿足要求!")w1=np.mat(w1)print("到更新的w1矩陣",w1 )print("得到更新的w2矩陣",w2)print("全局損失; ",0.5*totalloss.dot(totalloss))breakupgrade_w1_w2() #調(diào)用函數(shù)def classfier(test):obs =test[0:,:3]hi_1=np.mat(w1[0]).dot(obs.T) - b1[0]hi_2=np.mat(w1[1]).dot(obs.T) - b1[1]ho_1=sigmoid(hi_1)ho_2=sigmoid(hi_2)hidden_output_array=[float(hi_1),float(hi_2)]outlayer_input_1=w2[0].dot(hidden_output_array)-b2[0]outlayer_output_1=sigmoid(outlayer_input_1)print("經(jīng)過最終神經(jīng)網(wǎng)絡(luò)訓練后,輸出層的實際輸出:", outlayer_output_1)if outlayer_output_1>0.45:print("該測試樣本和0.9代表的類別更接近")if outlayer_output_1<0.45:print("該測試樣本和0.1代表的類別更接近")if outlayer_output_1==0.45:print("該測試樣本可被任意歸為兩個類別之一")classfier(np.mat([[1.82,1.54,0]]))#這里的測試樣本[[2.08,1.56,0]]是我從原先14個樣本中挑選的,訓練集有13個,留了1個作為測試,該樣本的target的確是0.1#說明我們訓練出的BP神經(jīng)網(wǎng)絡(luò)模型有可信度,訓練集如下圖所示,最后一列是target目標值
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎
總結(jié)
以上是生活随笔為你收集整理的基于sympy的python实现三层BP神经网络算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021年广州如何申请失业补助金最全攻略
- 下一篇: C++中友元函数,友元类数详解