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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

【机器学习】--神经网络(NN)

發(fā)布時(shí)間:2024/3/12 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【机器学习】--神经网络(NN) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

簡(jiǎn)單介紹:

神經(jīng)網(wǎng)絡(luò)主要是默認(rèn)人類腦結(jié)構(gòu)進(jìn)行的一種代碼程序結(jié)構(gòu)的表現(xiàn),同時(shí)是RNN,CNN,DNN的基礎(chǔ)。結(jié)構(gòu)上大體上分為三個(gè)部分(輸入,含隱,輸出),各層都有個(gè)的講究,其中,輸入層主要是特征處理后的入口,含隱層用來(lái)訓(xùn)練相應(yīng)函數(shù),節(jié)點(diǎn)越多,訓(xùn)練出的函數(shù)就越復(fù)雜,輸出層輸出相應(yīng)的預(yù)測(cè)結(jié)果,比較常見的就是多分類了。

算法特點(diǎn):

1、神經(jīng)網(wǎng)絡(luò)屬于有監(jiān)督學(xué)習(xí)的一種; 2、計(jì)算復(fù)雜度比較高,因?yàn)樵黾恿讼鄳?yīng)的激活函數(shù),所以等于復(fù)合函數(shù)嵌套復(fù)合函數(shù); 3、含隱層的神經(jīng)元越多,計(jì)算函數(shù)便越復(fù)雜,但帶來(lái)的好處是,不用過(guò)度考慮特征方程,較其它機(jī)器學(xué)習(xí)入門算法而言,省卻了特征適配; 4、BP后向傳播其實(shí)就是誤差函數(shù)反推參數(shù)求導(dǎo)過(guò)程,不知道為什么網(wǎng)絡(luò)上的很多博客都沒有人點(diǎn)出來(lái),可能是使用BP后向傳播算法,讓別人聽起來(lái)更厲害一些吧; 5、需要考慮過(guò)擬合問(wèn)題; 6、數(shù)學(xué)不好別看了,看前五條就行了。

學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)的基本流程:

1、了解基礎(chǔ)知識(shí)(簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò)構(gòu)造,激活函數(shù),誤差函數(shù)); 2、推導(dǎo) 3、完成代碼 4、畫圖看效果

基礎(chǔ)知識(shí):

神經(jīng)網(wǎng)絡(luò)


上圖建立具有一個(gè)輸入層、一個(gè)隱藏層、一個(gè)輸出層的三層神經(jīng)網(wǎng)絡(luò)。輸入層的結(jié)點(diǎn)數(shù)由數(shù)據(jù)維度決定,這里是2維。類似地,輸出層的結(jié)點(diǎn)數(shù)由類別數(shù)決定,也是2。(因?yàn)槲覀冎挥袃深愝敵?#xff0c;實(shí)際中我們會(huì)避免只使用一個(gè)輸出結(jié)點(diǎn)預(yù)測(cè)0和1,而是使用兩個(gè)輸出結(jié)點(diǎn)以使網(wǎng)絡(luò)以后能很容易地?cái)U(kuò)展到更多類別)。每一個(gè)神經(jīng)元都可以理解成一個(gè)函數(shù),這個(gè)函數(shù),也可以叫做激活函數(shù),例如,輸入神經(jīng)元理解為Fin(x),含隱神經(jīng)元理解為Fhn(x),輸出神經(jīng)元理解為Fou(x),每一層之間都是具有一個(gè)權(quán)重參數(shù)w(或者叫θ),每一層的輸出乘上權(quán)重參數(shù),都是下一層的輸入,例如,Fin( input1 ) * w1 就是含隱層的輸入,Fhn( Fin( input1 ) * w1 ) *w2 就是輸出層的輸入,Fou( Fhn( Fin(input1 ) * w1 ) * w2 )計(jì)算出最后的輸出值。

常見的激活函數(shù):

1、Sigmoid函數(shù)(也叫l(wèi)ogistics函數(shù)) 2、Tanh函數(shù)(雙曲函數(shù)) 3、sgn函數(shù)(階躍函數(shù)) 4、ReLU函數(shù) 5、softmax函數(shù) 6、Linear函數(shù)

誤差函數(shù):

參考我寫的機(jī)器學(xué)習(xí)--邏輯回歸這篇文章吧,里面有提到,這里我們使用的是對(duì)數(shù)似然損失。這里特別說(shuō)明一下,需要注意,交叉熵和對(duì)數(shù)似然很像,需要注意區(qū)別。

本次神經(jīng)網(wǎng)絡(luò)的三層形式:

輸入層:特征,用x表示 輸入層和含隱層之間的權(quán)重:使用w1表示 含隱層:tanh() 含隱層和輸出層之間的權(quán)重:使用w2表示 輸出層:softmax() 輸出結(jié)果:Y表示(帶上角標(biāo)的那個(gè)我打不出來(lái)。。。)

softmax的函數(shù)如下:


其中,Yi表示第i類的輸出,xi表示第i類的輸入,底部的是所有輸入的求和。

softmax的求導(dǎo):

需要先行注意的是,底部xk的累加和是包含n個(gè)未知參數(shù)的,但在求導(dǎo)過(guò)程中,除了對(duì)其求到的那個(gè)未知參數(shù)外,其它參數(shù),都視為常數(shù)項(xiàng); f(xi)對(duì)xi求導(dǎo):

f(xi)對(duì)xa求導(dǎo):




推導(dǎo):

正向傳播(也就是預(yù)測(cè)過(guò)程,即開始輸入到最后輸出的過(guò)程,求y):

y = softmax (?tanh ( x * w1 ) * w2 )

后向傳播(求w2,w1):

后向傳播就是倒著推,先推輸出層到含隱層之間的權(quán)重w2,那么假設(shè)我們的真實(shí)值用大Y表示,我們的預(yù)測(cè)值用小y表示,那么他們之間的誤差是Loss = ( Y - y) ,但由于我們softmax函數(shù)是指數(shù)形式,且本身是概率性問(wèn)題,我們使用最大似然損失函數(shù)(也叫對(duì)數(shù)似然損失函數(shù)),Loss = -ln ( y ) ,(注,在書上見到的log其實(shí)就是ln,表示以e為底,表示的含義是,y是當(dāng)前樣本下預(yù)測(cè)模型得到的概率) 那么損失函數(shù)Loss =- ln ( y ) ,也就是說(shuō),要在損失最小的情況下求參數(shù)w2, 求參數(shù)求參數(shù)還要損失最小,梯度下降就可以了,已知梯度下降公式: w = w - α(?Loss /?w); 那么令 結(jié)果 a = tanh(x*w1)* w2 求取過(guò)程如下:
? ? ?各項(xiàng)如下:

所以:w2 = w2 -?α ?* [? ( yi - 1) * tanh( xi * w1 ) ]
同理,對(duì)b2進(jìn)行求導(dǎo):
同理,進(jìn)行對(duì)誤差函數(shù)中的w1求導(dǎo): 所以:w1 = w1 -?α ?* [? (? yi - 1 ) * [ 1 - (tanh( w1 * xi ))^2 ] * w2 * xi ] ? ? 同理,對(duì)b1求導(dǎo):
這樣,后向傳播也推導(dǎo)完了。

開始部署程序,程序分為以下幾步:

1、獲取數(shù)據(jù)進(jìn)行處理 2、softmax公式構(gòu)建 2.5、參數(shù)初始化(主要是權(quán)重) 3、前向傳播(就是預(yù)測(cè)函數(shù))構(gòu)建 4、后向傳播構(gòu)建 5、誤差函數(shù)構(gòu)建 5.5、組合函數(shù)進(jìn)行訓(xùn)練 6、訓(xùn)練結(jié)果評(píng)估 7、畫圖
本程序使用以下庫(kù),并使用以下全局變量: import numpy as np from sklearn.datasets import make_moons import matplotlib.pyplot as plt #學(xué)習(xí)速率 learning_rate = 0.01#正則化參數(shù) reg_lambda = 0.01#特征數(shù)據(jù) data_x = []#data_y對(duì)應(yīng)結(jié)果,mat_data_y結(jié)果的表示矩陣形式 data_y = [] mat_data_y = []#權(quán)重參數(shù) weights1 = [] weights2 = [] b1 = [] b2 = []#誤差 loss = []
第一步,數(shù)據(jù)獲取:
def get_data():global data_x,data_ynp.random.seed(0)data_x, data_y = make_moons(200, noise=0.20)max_y = max(data_y)m = len(data_x)

第二步,數(shù)學(xué)公式構(gòu)建(我們只需要構(gòu)建最后的分類函數(shù)softmax):
#定義softmax函數(shù) def softmax(x):return np.exp(x)/(np.sum( np.exp(x) ,axis=1,keepdims=True))
第二點(diǎn)五步,參數(shù)初始化(主要是權(quán)重):
#input_layout_num是輸入層層數(shù),hide_layout_num是含隱層層數(shù),output_layout_num是輸出層層數(shù) def set_params(hide_layout_num = 3 ):global weights1, weights2 ,b1 ,b2input_layout_num = len(data_x[0])output_layout_num = len(mat_data_y[0])# weights1 = np.ones((input_layout_num, hide_layout_num))# weights2 = np.ones((hide_layout_num, output_layout_num))weights1 = np.random.randn(input_layout_num, hide_layout_num)/ np.sqrt(input_layout_num)weights2 = np.random.randn(hide_layout_num, output_layout_num)/np.sqrt(hide_layout_num)# print(weights1)# weights1 = np.ones((input_layout_num, hide_layout_num))b1 = np.zeros((1,hide_layout_num))b2 = np.zeros((1,output_layout_num)) ? 第三步,前向傳播(就是預(yù)測(cè)函數(shù))構(gòu)建: #前向傳播計(jì)算 def forward_propagation():input_hide_calc_pe = np.dot(data_x ,weights1) + b1 #input_hide_calc_pe為輸入層和含隱層之間的參數(shù)方程計(jì)算值hide_activation_val = np.tanh(input_hide_calc_pe)#hide_activation_val是含隱層激活函數(shù)值hide_output_calc_pe = np.dot(hide_activation_val, weights2) + b2#hide_output_calc_pe是含隱層和輸出層之間的參數(shù)方程計(jì)算值output_proba = softmax(hide_output_calc_pe)#out_proba是最后選擇softmax函數(shù)計(jì)算出的概率,也就是預(yù)測(cè)值return hide_activation_val,output_proba#預(yù)測(cè)函數(shù) def predict(x):input_hide_calc_pe = np.dot(x ,weights1) + b1 #input_hide_calc_pe為輸入層和含隱層之間的參數(shù)方程計(jì)算值hide_activation_val = np.tanh(input_hide_calc_pe)#hide_activation_val是含隱層激活函數(shù)值hide_output_calc_pe = np.dot(hide_activation_val, weights2) + b2#hide_output_calc_pe是含隱層和輸出層之間的參數(shù)方程計(jì)算值output_proba = softmax(hide_output_calc_pe)#out_proba是最后選擇softmax函數(shù)計(jì)算出的概率,也就是預(yù)測(cè)值result = np.max(output_proba,axis=1)kind = np.argmax(output_proba,axis=1)print(output_proba)print("預(yù)測(cè)結(jié)果為第:" + str( kind) + "類\n"+"預(yù)測(cè)系數(shù)為:" + str(result) )return kind#返回每一組中最大數(shù)值對(duì)應(yīng)位置的索引 之所以寫兩個(gè)是因?yàn)楹竺娴哪莻€(gè)畫圖和單點(diǎn)預(yù)測(cè)需要使用
第四步,后向傳播構(gòu)建: #后向傳播計(jì)算,output_proba輸出層計(jì)算出的概率 def back_propagation( hide_activation_val, output_proba):global weights2,weights1,b1,b2feature_x_len,feature_x0_len = np.shape(data_x)delta_w2_1 = output_proba#(yi - 1 )for i in range(feature_x_len):delta_w2_1[i][data_y[i]] = delta_w2_1[i][data_y[i]] - 1# (yi - 1 ) * tanh(w1 * xi)delta_w2 = np.dot(hide_activation_val.T, delta_w2_1)#b2 = yi - 1delta_b2 = np.sum(delta_w2_1,axis=0,keepdims=True)#[ ( yi - 1 ) * [ 1 - (tanh( w1 * xi ))^2 ] * w2 * xi ]#1 - (tanh( w1 * xi ))^2delta_w1_2 = (1 - hide_activation_val**2)delta_w1_1 = np.dot(delta_w2_1 ,weights2.T)delta_w1_3 = delta_w1_1 * delta_w1_2delta_w1 = np.dot(data_x.T,delta_w1_3)delta_b1 = np.sum(delta_w1_3,axis=0,keepdims=True)delta_w2 = delta_w2 + reg_lambda * weights2delta_w1 = delta_w1 + reg_lambda * weights1weights1 = weights1 - learning_rate * delta_w1b1 = b1 - learning_rate * delta_b1weights2 = weights2 - learning_rate * delta_w2b2 = b2 - learning_rate * delta_b2

第五步,誤差函數(shù)構(gòu)建: #誤差函數(shù) def loss_func():global loss#Loss = - ln p(y|x) = - ln yiloss_sum = 0.0hide_activation_val, output_proba = forward_propagation()for i in range(len(data_x)):loss_sum = loss_sum + -1 * np.log( output_proba[i][data_y[i]] )loss.append(1/len(data_x) * loss_sum)
第五點(diǎn)五步,訓(xùn)練: def train(iter_num = 1,hide_layout_num = 3):set_params(hide_layout_num)for i in range(iter_num):hide_activation_val,output_proba = forward_propagation()back_propagation(hide_activation_val,output_proba)loss_func()
第六步,訓(xùn)練結(jié)果評(píng)估: #評(píng)估訓(xùn)練結(jié)果 def train_result_evaluate():hide_activation_val, output_proba = forward_propagation()output_result = np.argmax(output_proba,axis=1) #返回每一組中最大數(shù)值對(duì)應(yīng)位置的索引x_num = len(output_result)real_num = 0.0for i in range(x_num):if output_result[i] == data_y[i]:real_num += 1.0score = real_num / x_numprint("本次樣本數(shù)共:" + str(x_num) + "個(gè)\n"+"訓(xùn)練后預(yù)測(cè)正確數(shù)量:"+ str(real_num) + "個(gè)\n"+"正確率為:" + str(score * 100 ) + r'%' )
第七步,畫圖: #畫決策邊界 def show_decision_pic():# Set min and max values and give it some paddingx_max = max(data_x[:,0]) + 0.5x_min = min(data_x[:,0]) - 0.5y_max = max(data_x[:,1]) + 0.5y_min = min(data_x[:,1]) - 0.5range_space = 0.01# Generate a grid of points with distance h between themfeature_x1 = np.arange(x_min, x_max, range_space) #其橫向特征最大最小生成的范圍值feature_x2 = np.arange(y_min, y_max, range_space) #其縱向特征最大最小生成的范圍值x1, x2 = np.meshgrid(feature_x1, feature_x2) #將特征變化成行列相等的矩陣# Predict the function value for the whole gidfeature = np.c_[x1.ravel(), x2.ravel()] #拼接成二維矩陣print(np.shape(feature))Z = predict(feature)print(Z)Z = Z.reshape(x1.shape)# Plot the contour and training examplesplt.contour(feature_x1, feature_x2, Z)plt.scatter(data_x[:, 0], data_x[:, 1], c=data_y, cmap=plt.cm.Spectral)plt.show()def show_loss_pic():plt.figure(2)plt.plot(loss)plt.show()
運(yùn)行程序:
if __name__ == "__main__":get_data()train(iter_num=20000,hide_layout_num=3)print("初始loss:" + str(loss[0]))print("最終loss:" + str(loss[-1]))train_result_evaluate()show_decision_pic()show_loss_pic()#這里進(jìn)行一個(gè)單點(diǎn)預(yù)測(cè)predict(data_x[-5])

看一下結(jié)果:

決策邊界如下:
誤差損失逐漸收斂:

誤差值:

評(píng)估結(jié)果:


最后的單點(diǎn)預(yù)測(cè)(因?yàn)閮深惙謩e是用0和1表示的,所以第一類是第[0]類,第二類是第[1]類):


關(guān)于關(guān)于程序中權(quán)重初始化的說(shuō)明(對(duì)應(yīng)在set_param函數(shù)): 關(guān)于程序中,權(quán)重為什么是這樣設(shè)置,還不是像基礎(chǔ)的機(jī)器學(xué)習(xí)方法,設(shè)置全0或全1矩陣,原因就是因?yàn)?#xff0c;如果設(shè)置相同矩陣,那么所有神經(jīng)元計(jì)算出來(lái)的結(jié)果是一樣的,反向傳播時(shí),計(jì)算的梯度就一樣了,參數(shù)就會(huì)一樣,具體說(shuō)明,請(qǐng)參考引用【4】.
寫在最后,可以看出來(lái),神經(jīng)網(wǎng)絡(luò)的計(jì)算比之前基礎(chǔ)機(jī)器學(xué)習(xí)稍稍復(fù)雜一些,但套路還是一樣的,就是多了一點(diǎn),但好處也可以從圖中看出來(lái),尤其是和之前的邏輯回歸比較后更容易得出鮮明結(jié)論,神經(jīng)網(wǎng)絡(luò)省去了找尋復(fù)雜特征方程的選擇,神經(jīng)元的多少就會(huì)決定自己處理的特征的復(fù)雜度。 比如使用30層含隱層,迭代2w次,看下效果 但這樣的情況,就過(guò)擬合了,并不平滑,這樣做出來(lái)的權(quán)重和函數(shù),就不是預(yù)測(cè)了,無(wú)法體現(xiàn)我們做出來(lái)的東西的是具有通用適配性的。

圖文知識(shí)及引用參考:


【1】softmax的推導(dǎo):http://blog.csdn.net/behamcheung/article/details/71911133 【2】看了這篇文章,開始嘗試寫神經(jīng)網(wǎng)絡(luò):http://python.jobbole.com/82208/ 【3】實(shí)際上,【2】是翻譯的github上的一篇文章( 打開ipynb格式):https://github.com/dennybritz/nn-from-scratch 【4】權(quán)重初始化的選擇原因:http://blog.csdn.net/bixiwen_liu/article/details/52956727 【5】python繪圖的函數(shù)說(shuō)明:https://www.cnblogs.com/shuhanrainbow/p/6282452.html 【6】如何畫等高線:https://zhidao.baidu.com/question/922394146083399819.html

總結(jié)

以上是生活随笔為你收集整理的【机器学习】--神经网络(NN)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。