優(yōu)化神經(jīng)網(wǎng)絡(luò)梯度算法——Adam

-- coding: utf-8 --

"""
Created on Wed Oct 3 21:54:36 2018

@author: ltx
"""

采用優(yōu)化的梯度算法如:動(dòng)量梯度下降算法症虑,adam算法等來(lái)提高精確度市埋。

import numpy as np
import matplotlib.pyplot as plt
import scipy.io
import math
import sklearn
import sklearn.datasets

import opt_utils
import testCase
plt.rcParams['figure.figsize'] = (7.0, 4.0) # set default size of plots
plt.rcParams['image.interpolation'] = 'nearest'
plt.rcParams['image.cmap'] = 'gray'

---------------------劃分?jǐn)?shù)據(jù)集為minibatch-------------------

def GetMinibatch(X,Y,batch_number,seed=0):
np.random.seed(seed)#指定隨機(jī)種子
m=X.shape[1]

Number=math.floor(m/batch_number) #floor為向上取整
#打亂測(cè)試集的順序
A=list(np.random.permutation(m))  #生成0~m-1的隨機(jī)數(shù)
shuffer_X=X[:,A]
shuffer_Y=Y[:,A].reshape((1,m))
Bacths=[]
for i in range(0,Number):
    shuffer_batch_X=shuffer_X[:,i*(batch_number):(i+1)*(batch_number)]
    shuffer_batch_Y=shuffer_Y[:,i*(batch_number):(i+1)*(batch_number)]
    Bacths.append((shuffer_batch_X,shuffer_batch_Y))
    
if(m%batch_number!=0):
    shuffer_batch_X=shuffer_X[:,Number*batch_number:]
    shuffer_batch_Y=shuffer_Y[:,Number*batch_number:]
    Bacths.append((shuffer_batch_X,shuffer_batch_Y))
return Bacths 

print("-------------測(cè)試random_mini_batches-------------")
X_assess,Y_assess,mini_batch_size = testCase.random_mini_batches_test_case()
mini_batches = GetMinibatch(X_assess,Y_assess,mini_batch_size)

print("第1個(gè)mini_batch_X 的維度為:",mini_batches[0][0].shape)
print("第1個(gè)mini_batch_Y 的維度為:",mini_batches[0][1].shape)
print("第2個(gè)mini_batch_X 的維度為:",mini_batches[1][0].shape)
print("第2個(gè)mini_batch_Y 的維度為:",mini_batches[1][1].shape)
print("第3個(gè)mini_batch_X 的維度為:",mini_batches[2][0].shape)
print("第3個(gè)mini_batch_Y 的維度為:",mini_batches[2][1].shape)

采用動(dòng)量梯度下降算法_初始化動(dòng)量矢量

def Initial_velocity(parameters):
L=len(parameters)//2 #L=4 //除后結(jié)果為整數(shù),/除后結(jié)果為浮點(diǎn)數(shù)
V={}
for l in range(L):

    V["dW"+str(l+1)]=np.zeros_like(parameters["W"+str(l+1)])
    V["db"+str(l+1)]=np.zeros_like(parameters["b"+str(l+1)])
return V

測(cè)試initialize_velocity

print("-------------測(cè)試initialize_velocity-------------")
parameters = testCase.initialize_velocity_test_case()
v = Initial_velocity(parameters)

print('v["dW1"] = ' + str(v["dW1"]))
print('v["db1"] = ' + str(v["db1"]))
print('v["dW2"] = ' + str(v["dW2"]))
print('v["db2"] = ' + str(v["db2"]))

def UpdateWith_velocity (parameters,grads,V,beta,learning_rate):
L=len(parameters)//2
for l in range(L):
V["dW"+str(l+1)]=betaV["dW"+str(l+1)]+(1-beta)grads["dW"+str(l+1)]
V["db"+str(l+1)]=betaV["db"+str(l+1)]+(1-beta)grads["db"+str(l+1)]

    parameters["W"+str(l+1)]=parameters["W"+str(l+1)]-learning_rate*V["dW"+str(l+1)]
    parameters["b"+str(l+1)]=parameters["b"+str(l+1)]-learning_rate*V["db"+str(l+1)]
return parameters,V

測(cè)試update_parameters_with_momentun

print("-------------測(cè)試update_parameters_with_momentun-------------")
parameters,grads,v = testCase.update_parameters_with_momentum_test_case()
UpdateWith_velocity (parameters,grads,v,beta=0.9,learning_rate=0.01)

print("W1 = " + str(parameters["W1"]))
print("b1 = " + str(parameters["b1"]))
print("W2 = " + str(parameters["W2"]))
print("b2 = " + str(parameters["b2"]))
print('v["dW1"] = ' + str(v["dW1"]))
print('v["db1"] = ' + str(v["db1"]))
print('v["dW2"] = ' + str(v["dW2"]))
print('v["db2"] = ' + str(v["db2"]))

-------------Adam算法---------------------------------

初始化Adam所需要的參數(shù):

def initial_Adam(parameters):
L=len(parameters)//2
S={}
V={}
for l in range(L):
S["dW"+str(1+l)]=np.zeros_like(parameters["W"+str(1+l)])
S["db"+str(1+l)]=np.zeros_like(parameters["b"+str(1+l)])

    V["dW"+str(1+l)]=np.zeros_like(parameters["W"+str(1+l)])
    V["db"+str(1+l)]=np.zeros_like(parameters["b"+str(1+l)])
return V,S

測(cè)試initialize_adam

print("-------------測(cè)試initialize_adam-------------")
parameters = testCase.initialize_adam_test_case()
v,s = initial_Adam(parameters)

print('v["dW1"] = ' + str(v["dW1"]))
print('v["db1"] = ' + str(v["db1"]))
print('v["dW2"] = ' + str(v["dW2"]))
print('v["db2"] = ' + str(v["db2"]))
print('s["dW1"] = ' + str(s["dW1"]))
print('s["db1"] = ' + str(s["db1"]))
print('s["dW2"] = ' + str(s["dW2"]))
print('s["db2"] = ' + str(s["db2"]))

------使用Adam公式更新參數(shù)----------------

def Update_parameter_Adam(parameters,grads,V,S,t,learning_rate=0.01,beta1=0.9,beta2=0.999,epsilon=1e-8):
L=len(parameters)//2
V_corrected={}
S_corrected={}
for l in range(L):
V["dW"+str(1+l)]=beta1V["dW"+str(1+l)]+(1-beta1)grads["dW"+str(1+l)]
V["db"+str(1+l)]=beta1V["db"+str(1+l)]+(1-beta1)grads["db"+str(1+l)]

    V_corrected["dW"+str(1+l)]=V["dW"+str(1+l)]/(1-np.power(beta1,t))
    V_corrected["db"+str(1+l)]=V["db"+str(1+l)]/(1-np.power(beta1,t))
    
    S["dW"+str(1+l)]=beta2*S["dW"+str(1+l)]+(1-beta2)*np.square(grads["dW"+str(1+l)])
    S["db"+str(1+l)]=beta2*S["db"+str(1+l)]+(1-beta2)*np.square(grads["db"+str(1+l)])
    
    S_corrected["dW"+str(1+l)]=S["dW"+str(1+l)]/(1-np.power(beta2,t))
    S_corrected["db"+str(1+l)]=S["db"+str(1+l)]/(1-np.power(beta2,t))
    
    parameters["W"+str(1+l)]=parameters["W"+str(1+l)]-learning_rate*(V_corrected["dW"+str(1+l)])/(np.sqrt(S_corrected["dW"+str(1+l)])+epsilon)
    parameters["b"+str(1+l)]=parameters["b"+str(1+l)]-learning_rate*(V_corrected["db"+str(1+l)])/(np.sqrt(S_corrected["db"+str(1+l)])+epsilon)
return parameters,V,S

測(cè)試update_with_parameters_with_adam

print("-------------測(cè)試update_with_parameters_with_adam-------------")
parameters , grads , v , s = testCase.update_parameters_with_adam_test_case()
Update_parameter_Adam(parameters,grads,v,s,t=2)

print("W1 = " + str(parameters["W1"]))
print("b1 = " + str(parameters["b1"]))
print("W2 = " + str(parameters["W2"]))
print("b2 = " + str(parameters["b2"]))
print('v["dW1"] = ' + str(v["dW1"]))
print('v["db1"] = ' + str(v["db1"]))
print('v["dW2"] = ' + str(v["dW2"]))
print('v["db2"] = ' + str(v["db2"]))
print('s["dW1"] = ' + str(s["dW1"]))
print('s["db1"] = ' + str(s["db1"]))
print('s["dW2"] = ' + str(s["dW2"]))
print('s["db2"] = ' + str(s["db2"]))

-------普通的梯度下降方法---------------------

def Upadate_parameter(parameters,grads,learing_rate=0.8):
L=len(parameters)//2
for l in range(L):
parameters["W"+str(1+l)]=parameters["W"+str(1+l)]-learing_rategrads["dW"+str(1+l)]
parameters["b"+str(1+l)]=parameters["b"+str(1+l)]-learing_rate
grads["db"+str(1+l)]
return parameters

----------------model------------------------

加載數(shù)據(jù)集

train_X,train_Y = opt_utils.load_dataset(is_plot=False)

分成一小批一小批的數(shù)據(jù)batch

batch_number=64
layer_dims=[train_X.shape[0],5,2,1]

初始化模型參數(shù)

costs = []
parameters=opt_utils.initialize_parameters(layer_dims)

循環(huán)訓(xùn)練模型參數(shù)

def model (parameters,td="gd",learing_rate=0.0007,beta=0.9,is_plot=True,print_cost=True,iterations=10000):
t = 0
seed = 10
for i in range(iterations):
seed=seed+1
Batches = GetMinibatch(train_X,train_Y ,batch_number,seed)
for batch in Batches :
(bacth_X,batch_Y)=batch
#向前傳播
A3,cache=opt_utils.forward_propagation(bacth_X,parameters)
#計(jì)算cost
cost=opt_utils.compute_cost(A3,batch_Y)
#向后傳播
grads=opt_utils.backward_propagation(bacth_X,batch_Y,cache)
#更新模型參數(shù)
if(td=="gd"):
parameters=Upadate_parameter(parameters,grads,learing_rate)
elif(td=="velocity"):
V=Initial_velocity(parameters)
parameters,V=UpdateWith_velocity (parameters,grads,V,beta,learing_rate)
elif(td=="adam"):
V,S=initial_Adam(parameters)
t=t+1
parameters,V,S=Update_parameter_Adam(parameters,grads,V,S,t,learing_rate,beta1=0.9,beta2=0.999,epsilon=1e-8)

     #記錄誤差值
     if i % 100 == 0:
        costs.append(cost)
     #是否打印誤差值
     if print_cost and i % 1000 == 0:
        print("第" + str(i) + "次遍歷整個(gè)數(shù)據(jù)集倒源,當(dāng)前誤差值:" + str(cost))
if is_plot:
    plt.plot(costs)
    plt.ylabel('cost')
    plt.xlabel('epochs (per 100)')
    plt.title("Learning rate =" + str(learing_rate))
    plt.show()

return parameters

parameters = model(parameters,td="gd",is_plot=True)

預(yù)測(cè)

preditions = opt_utils.predict(train_X,train_Y,parameters)

繪制分類圖

plt.title("Model with Gradient Descent optimization")
axes = plt.gca()
axes.set_xlim([-1.5, 2.5])
axes.set_ylim([-1, 1.5])
opt_utils.plot_decision_boundary(lambda x: opt_utils.predict_dec(parameters, x.T), train_X, train_Y)

--------------實(shí)驗(yàn)結(jié)果------------------------------


優(yōu)化梯度方法.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市遵湖,隨后出現(xiàn)的幾起案子塑娇,更是在濱河造成了極大的恐慌,老刑警劉巖形庭,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件铅辞,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡萨醒,警方通過(guò)查閱死者的電腦和手機(jī)斟珊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)富纸,“玉大人囤踩,你說(shuō)我怎么就攤上這事∠剩” “怎么了堵漱?”我有些...
    開(kāi)封第一講書人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)涣仿。 經(jīng)常有香客問(wèn)我勤庐,道長(zhǎng)示惊,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任愉镰,我火速辦了婚禮米罚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘丈探。我一直安慰自己录择,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布碗降。 她就那樣靜靜地躺著隘竭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪遗锣。 梳的紋絲不亂的頭發(fā)上货裹,一...
    開(kāi)封第一講書人閱讀 49,806評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音精偿,去河邊找鬼弧圆。 笑死,一個(gè)胖子當(dāng)著我的面吹牛笔咽,可吹牛的內(nèi)容都是我干的搔预。 我是一名探鬼主播,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼叶组,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼拯田!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起甩十,我...
    開(kāi)封第一講書人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤船庇,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后侣监,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體鸭轮,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年橄霉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了窃爷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡姓蜂,死狀恐怖按厘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情钱慢,我是刑警寧澤逮京,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站束莫,受9級(jí)特大地震影響懒棉,放射性物質(zhì)發(fā)生泄漏御吞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一漓藕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧挟裂,春花似錦享钞、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至渠啤,卻和暖如春狐肢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背沥曹。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工份名, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人妓美。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓僵腺,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親壶栋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子辰如,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容