Keras-人工神經(jīng)網(wǎng)絡(luò)--隨機(jī)梯度下降法

一、概念

????人工神經(jīng)網(wǎng)絡(luò)是是一種應(yīng)用類似于大腦神經(jīng)突觸聯(lián)接的結(jié)構(gòu)進(jìn)行信息處理的數(shù)學(xué)模型。這種模型可以適用于分類與回歸。

????神經(jīng)網(wǎng)絡(luò)的優(yōu)點:可以把非線性做的特別好,擬合能力特別強(qiáng),只要寬度足夠大,深度足夠深,神經(jīng)網(wǎng)絡(luò)就可以擬合任何非線性的映射。

????神經(jīng)網(wǎng)絡(luò)的缺點:比較耗費資源,而且容易過擬合。

????神經(jīng)網(wǎng)絡(luò)主要應(yīng)用: 圖像識別,語音識別,自然語言處理等。

????人工智能領(lǐng)域有個概念,叫深度學(xué)習(xí),深度學(xué)習(xí)的基礎(chǔ)就是深度神經(jīng)網(wǎng)絡(luò)。

二、人工神經(jīng)網(wǎng)絡(luò)算法

人工神經(jīng)網(wǎng)絡(luò)主要有兩種算法:

????1.反向傳播算法(函數(shù)PyBrain())

????????第一步,前向計算,確定人工神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),參數(shù)都附上隨機(jī)值,不管這些值是多少,先把特征都輸入。比如有三個輸出,不管輸出是多少,先得到計算的值。

????????第二步,計算誤差。假如要計算的是1,0, 0;結(jié)果是0.2,誤差就是0.8;中間的是0.3,誤差就是0.3;最后的是0.8,誤差就是0.8;

????????第三步,反向單層調(diào)整。梯度調(diào)整的過程,根據(jù)誤差調(diào)整離輸出層最近的一層的系數(shù),利用梯度下降進(jìn)行調(diào)整;

????????第四步,傳播。調(diào)整好后再調(diào)整下一層,一層層調(diào)整,直到進(jìn)行一輪計算完成后,調(diào)整結(jié)束;然后不斷進(jìn)行迭代,直到模型達(dá)到收斂(條件為達(dá)到一定誤差范圍內(nèi)就是收斂,也可以設(shè)置迭代次數(shù),只要迭代次數(shù)到了,也可以認(rèn)為是收斂的)

反向傳播算法

????2.隨機(jī)梯度下降法(Stochastic Gradient Decent)

????????每次調(diào)整權(quán)值時,選取部分樣本進(jìn)行梯度下降。

????????好處:收斂更快,計算更少

????????缺點:容易陷入局部最優(yōu)

三、應(yīng)用神經(jīng)網(wǎng)絡(luò)注意事項

????1.易受離群點影響,易過擬合。這是回歸類模型的一個通病,處理方法是正則化或者dropout。dropout就是在神經(jīng)網(wǎng)絡(luò)每層隨機(jī)選擇幾個不同的節(jié)點,組成多個神經(jīng)網(wǎng)絡(luò)模型,通過投票選擇最終的值,對于回歸模型可以取平均。

????2.屬性與結(jié)果要在0~1之間。而且結(jié)果是one-hot形式存在的

????3.輸出結(jié)果要進(jìn)行softmax轉(zhuǎn)化。即讓所有輸出值的加和恒等于1,這樣每個輸出值就代表這個輸出的概率。

dropout示意圖

四、代碼實現(xiàn)(部分代碼)

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

說明:這里用了adam優(yōu)化器,也是隨機(jī)梯度優(yōu)化器的一種,計算速度比SGD更快;在擬合效果不理想的情況下,可以調(diào)整迭代次數(shù)nb_epoch 或 增加樣本數(shù)量batch_size,可以通過更改優(yōu)化器optimizer(比如將sgd改為adam),也可以調(diào)整學(xué)習(xí)率lr,但是lr相當(dāng)于梯度下降里的α,學(xué)習(xí)率越大意味著很可能擬合不到最優(yōu)點,所以lr不能取太大;所以這里用了增加迭代次數(shù)和隨機(jī)抽樣數(shù)量的方法,以達(dá)到最優(yōu)效果。

源代碼:

from keras.models import Sequential

from keras.layers.core import Dense,Activation

from keras.optimizers import SGD

mdl = Sequential()?

mdl.add(Dense(50,input_dim=len(f_v[0])))?

mdl.add(Activation('sigmoid'))?

mdl.add(Dense(2))? # 輸出維度設(shè)定?

mdl.add(Activation('softmax'))??

sgd = SGD(lr=0.05)?

mdl.compile(loss="mean_squared_error",optimizer="adam")

mdl.fit(X_train,np.array([[0,1] if i == 1 else [1,0] for i in Y_train]),nb_epoch=20000,batch_size=8999)

# nb_epoch 表示迭代的次數(shù),合理取值; batch_size 隨機(jī)梯度算法每次選取的數(shù)量,由于本樣本數(shù)據(jù)量不是很大,所以取全部訓(xùn)練集?

xy_lst = [(X_train,Y_train),(X_validation,Y_validation),(X_test,Y_test)]?

for i in range(len(xy_lst)):?

? ? X_part = xy_lst[i][0]?

? ? Y_part = xy_lst[i][1]?

? ? Y_pred = mdl.predict_classes(X_part)??

? ? print(i)?

? ? print("NN",'--ACC',accuracy_score(Y_part,Y_pred))?

? ? print("NN",'--REC',recall_score(Y_part,Y_pred))?

? ? print("NN",'--F_score',f1_score(Y_part,Y_pred))?

return?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容