日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

基于sympy的python实现三层BP神经网络算法

發布時間:2025/3/11 python 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于sympy的python实现三层BP神经网络算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
#!/usr/bin/python # -*- coding: utf-8 -*- """ 寫一個三層的BP神經網絡(3,2,1),3是輸入數據的維度,隱層設置節點數為2,1是因為每個觀測的target都是一個標量即只有一個數; 1.隨機生成兩個隨機矩陣作為三個層之間的連接權值,注意矩陣大小設置;設定誤差閾值等參數 2.使用i=random.randint(0,len(x)-1)隨機產生一個樣品的輸入及target 3.使用權值w1,w2,sigmoid函數、diffsigmoid函數計算隱層和輸出層的輸入,輸出 4.利用上面的隨機樣品的實際輸出和期望輸出之差e,用e求偏導de/dwho、de/dwih 5.梯度下降法更新權值w1,w2 6.再次計算全局誤差,若滿足設定的誤差閾值,返回當前權值;否則重算 """ 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]#激活函數 def sigmoid(x):return ( 1/(1+np.exp(-x)) ) #激活函數的導函數 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 #迭代次數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""" 隨機抽取一個樣本計算兩個偏導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] #輸出層只有一個節點 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] #隱層第一個節點上的輸入hidden_input_2=np.mat(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_1=w2[0].dot(hidden_output_array)-b2[0] #輸出層的輸入outlayer_output_1=sigmoid(outlayer_input_1) #輸入層的輸出expect_output=y[i] #期望輸出就是每個觀測的target數值totalloss= [] #建立空列表用以求和loss=expect_output - outlayer_output_1 #loss是每個觀測的期望輸出與實際輸出的差totalloss.append(loss) #totalloss=np.array(totalloss) #把列表轉化為數組才能進行點乘"""如果全局誤差大于閾值就要更新權重"""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權值矩陣:\n",w1)print("誤差大于閾值時的w2權值矩陣:\n",w2)"""如果全局誤差小于閾值就返回目前權"""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() #調用函數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("經過最終神經網絡訓練后,輸出層的實際輸出:", 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神經網絡模型有可信度,訓練集如下圖所示,最后一列是target目標值

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的基于sympy的python实现三层BP神经网络算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。