Keras庫(kù)學(xué)習(xí)記-one 多層感知器

定義模型

Dense類定義完全連接的層

from keras.models import Sequential

from keras.layers import Dense


model = Sequential()

model.add(Dense(unit=12,input_dim=8,activation='relu'))

model.add(Dense(8,activation='relu'))

model.add(Dense(1,activation='sigmoid'))

其中unit(層中神經(jīng)元個(gè)數(shù))聋丝、init(初始化方法)轨帜、activation(激活函數(shù))

init為將網(wǎng)絡(luò)權(quán)重初始化為均勻分布的小隨機(jī)數(shù)唧领,默認(rèn)介于0和0.05之間的隨機(jī)數(shù)。也可選擇高斯分布產(chǎn)生小隨機(jī)數(shù)匙握。

activation包括ReLu(現(xiàn)研究表明可得更好性能)、sigmoid、tanh(首選)押框。

? ? ? ? ? ? ? ? ? 二分類的輸出層通常采用sigmoid作為激活函數(shù),單層神經(jīng)網(wǎng)絡(luò)中使用sgn理逊,多分類使用softmax 橡伞。

? ? ? ? ? ? ? ? ? 回歸問(wèn)題的輸出層不設(shè)置激活函數(shù)。


編譯模型

指定訓(xùn)練模型時(shí)所需的一些屬性晋被。

model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])

其中loss(評(píng)估一組權(quán)重的損失函數(shù))兑徘、optimizer(搜索網(wǎng)絡(luò)不同權(quán)重的優(yōu)化器)

loss對(duì)于二進(jìn)制分類問(wèn)題的對(duì)數(shù)損失函數(shù)被定義為二進(jìn)制交叉熵('binary_crossentropy')。

optimizer優(yōu)化器選取梯度下降法('adam')羡洛,默認(rèn)值挂脑。


訓(xùn)練模型

model.fit(x=x , y=Y , epochs=150 , batch_size=10)

其中epochs(固定迭代次數(shù))、batch_size(執(zhí)行神經(jīng)網(wǎng)絡(luò)中的權(quán)重更新的每個(gè)批次中所用實(shí)例的個(gè)數(shù))


評(píng)估模型

scores = model.evaluate(x=x , y=Y)

print('%s: %.2f%%' % (model.metrics_names[1],scores[1]*100))

evaluate()函數(shù)用來(lái)評(píng)估模型的精確度?


深度學(xué)習(xí)模型調(diào)參

from sklearn.model_selection import GridSearchCV

from keras.wrappers.scikit_learn import KerasClassifier


def create_model(optimizer='adam',init='glorot_uniform'):

? ? ? model = Sequential()

? ? ? model.add(Dense(12,kernel_initializer=init,input_dim=8,activation='relu'))

? ? ? model.add(Dense(8,kernel_initializer=init,activation='relu'))

? ? ? model.add(Dense(1,kernel_initializer=init,activation='sigmoid'))

? ? ? model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])

? ? ? return model

seed = 7

np.random.seed(seed)

dataset = np.loadtxt('C:\\Users\\ThinkPad\\Desktop\\Keras實(shí)踐\\多層感知器\\pima-indians-diabetes.csv',delimiter=',')

x = dataset[:,0:8]

y = dataset[:,8]

model = KerasClassifier(build_fn=create_model,verbose=0)

param_grid = {}

param_grid['optimizer'] = ['rmsprop','adam']

param_grid['init'] = ['glorot_uniform','normal','uniform']

param_grid['epochs'] = [50,100,150,200]

param_grid['batch_size'] = [5,10,20]

grid = GridSearchCV(estimator=model,param_grid=param_grid)

results = grid.fit(x,y)

print('Best: %f using %s' % (results.best_score_, results.best_params_))

means = results.cv_results_['mean_test_scores']

stds = results.cv_results_['std_test_scores']

params = results.cv_results_['params']

for mean,std,param in zip(means,stds,params):

? ? ? ? ?print('%f (%f) with: %r' % (mean,std,param))


Pipeline框架

便于在交叉驗(yàn)證的每一個(gè)折中執(zhí)行數(shù)據(jù)標(biāo)準(zhǔn)化處理欲侮。

首先標(biāo)準(zhǔn)化數(shù)據(jù)集崭闲,然后創(chuàng)建和評(píng)估基線神經(jīng)網(wǎng)絡(luò)模型。

steps = []

steps.append(('standardize',StandardScaler()))

steps.append(('mlp',model))

pipeline = Pipeline(steps)

kfold = KFold(n_splits=10,shuffle=True,random_state=seed)

results = cross_val_score(pipeline,x,y,cv=kfold)


模型增量更新

為了保證模型的時(shí)效性威蕉,需要定期對(duì)模型進(jìn)行更新刁俭,這個(gè)時(shí)間間隔通常是3~6個(gè)月,甚至1~2個(gè)月忘伞。

在數(shù)據(jù)量非常大是薄翅,若每次采用全部數(shù)據(jù)取重新訓(xùn)練模型,則時(shí)間開銷非常大氓奈,因此可以采用增量更新模型的方式對(duì)模型進(jìn)行訓(xùn)練翘魄。

對(duì)于時(shí)間序的預(yù)測(cè),增量更新相當(dāng)于默認(rèn)給最新的數(shù)據(jù)增加了權(quán)重舀奶,提高精確度暑竟。

from sklearn.model_selection import train_test_split

x_train,x_increment,Y_train,Y_increment = train_test_split(x,Y,test_size=0.2,random_state=seed)

······

new_model.compile(loss='categorical_crossentropy',optimizer='rmsprop',metrics=['accuracy'])

Y_increment_labels =to_categorical(Y_increment,num_classes=3)?

new_model.fit(x_increment,Y_increment_labels,epochs=10,batch_size=5,verbose=2)?

scores = new_model.evaluate(x_increment,Y_increment_labels,verbose=0)?

print('Incremrnt %s: %.2f%%' % (model.metrics_names[1],scores[1]*100))??


神經(jīng)網(wǎng)絡(luò)的檢查點(diǎn)

from keras.callbacks import ModelCheckpoint

filepath = 'weights-improvment-{epoch:02d}-{val_acc:.2f}.h5'

checkpoint = ModelCheckpoint(filepath=filepath,monitor='val_acc',verbose=1,save_best_only=False,mode='max')

''''''

#自動(dòng)保存最優(yōu)模型

filepath = 'weights.best.h5'

checkpoint = ModelCheckpoint(filepath=filepath,monitor='val_acc',verbose=1,save_best_only=True,mode='max')

''''''

callback_list = [checkpoint]

model.fit(x,Y_labels,validation_split=0.2,epochs=200,batch_size=5,verbose=0,callbacks=callback_list)

從檢查點(diǎn)導(dǎo)入模型

def load_model(optimizer='rmsprop',init='glorot_uniform'):

????model = Sequential() ????model.add(Dense(units=4,activation='relu',input_dim=4,kernel_initializer=init))?

????model.add(Dense(units=6,activation='relu',kernel_initializer=init)) ????model.add(Dense(units=3,activation='softmax',kernel_initializer=init))?

????filepath = 'weights.best.h5'

? ? model.load_weights(filepath=filepath) ????model.compile(loss='categorical_crossentropy',optimizer=optimizer,metrics=['accuracy'])

?????return model

#導(dǎo)入模型

model = load_model()

scores = model.evaluate(x,Y_labels,verbose=0)

print('%s: %.2f%%' % (model.metrics_names[1],scores[1]*100))


Drop與學(xué)習(xí)率衰減

drop針對(duì)神經(jīng)網(wǎng)絡(luò)模型的正則化方法。即在訓(xùn)練過(guò)程中育勺,隨機(jī)地忽略部分神經(jīng)元但荤。

輸入層使用Dropout

dropout率設(shè)置為20%,這意味著每個(gè)更新周期中20%的輸入將被隨機(jī)排除涧至。

def create_model(optimizer='rmsprop',init='glorot_uniform'):

? ? model = Sequential()

? ? model.add(Dropout(rate=0.2,input_shape=(4,)))

? ? model.add(Dense(units=4,activation='relu',input_dim=4,kernel_initializer=init))

? ? model.add(Dense(units=6,activation='relu',kernel_initializer=init))

? ? model.add(Dense(units=3,activation='softmax',kernel_initializer=init))


? ? sgd = SGD(lr=0.01,momentum=0.8,decay=0.0,nesterov=False)? #定義Dropout


? ? model.compile(loss='categorical_crossentropy',optimizer=optimizer,metrics=['accuracy'])


? ? return model

隱含層使用Dropout

def create_model(init='glorot_uniform'):

? ? model = Sequential()

? ? model.add(Dense(units=4,activation='relu',input_dim=4,kernel_initializer=init,kernel_constraint=maxnorm(3))) #約束權(quán)重最大限度不超過(guò)3

? ? model.add(Dropout(rate=0.2))

? ? model.add(Dense(units=6,activation='relu',input_dim=4,kernel_initializer=init,kernel_constraint=maxnorm(3)))

? ? model.add(Dropout(rate=0.2))

? ? model.add(Dense(units=3,activation='softmax',kernel_initializer=init))


? ? sgd = SGD(lr=0.01,momentum=0.8,decay=0.0,nesterov=False)


? ? model.compile(loss='categorical_crossentropy',optimizer=sgd,metrics=['accuracy'])


? ? return model

學(xué)習(xí)率衰減

# 學(xué)習(xí)率線性衰減

def create_model(init='glorot_uniform'):

? ? model = Sequential()

? ? model.add(Dense(units=4,activation='relu',input_dim=4,kernel_initializer=init))

? ? model.add(Dense(units=6,activation='relu',kernel_initializer=init))

? ? model.add(Dense(units=3,activation='softmax',kernel_initializer=init))

? ? learningRate = 0.1

? ? momentum = 0.9

? ? decay_rate = 0.005

? ? sgd = SGD(lr=learningRate,momentum=momentum,decay=decay_rate,nesterov=False)

? ? model.compile(loss='categorical_crossentropy',optimizer=sgd,metrics=['accuracy'])

? ? return model

epochs = 200

model = KerasClassifier(build_fn = create_model,epochs=epochs,batch_size=5,verbose=1)

model.fit(x,Y)


# 學(xué)習(xí)率指數(shù)衰減

def step_decay(epoch):

? ? init_lrate = 0.1

? ? drop = 0.5

? ? epochs_drop = 10

? ? lrate = init_lrate*pow(drop,floor(1+epoch)/epochs_drop)

? ? return lrate

def create_model(init='glorot_uniform'):

? ? model = Sequential()

? ? model.add(Dense(units=4,activation='relu',input_dim=4,kernel_initializer=init))

? ? model.add(Dense(units=6,activation='relu',kernel_initializer=init))

? ? model.add(Dense(units=3,activation='softmax',kernel_initializer=init))

? ? learningRate = 0.1

? ? momentum = 0.9

? ? decay_rate = 0.0

? ? sgd = SGD(lr=learningRate,momentum=momentum,decay=decay_rate,nesterov=False)

? ? model.compile(loss='categorical_crossentropy',optimizer=sgd,metrics=['accuracy'])

? ? return model

lrate = LearningRateScheduler(step_decay)

epochs = 200

model = KerasClassifier(build_fn = create_model,epochs=epochs,batch_size=5,verbose=1,callbacks=[lrate])

model.fit(x,Y)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末腹躁,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子南蓬,更是在濱河造成了極大的恐慌纺非,老刑警劉巖哑了,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異烧颖,居然都是意外死亡弱左,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門炕淮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)拆火,“玉大人,你說(shuō)我怎么就攤上這事涂圆∶蔷担” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵乘综,是天一觀的道長(zhǎng)憎账。 經(jīng)常有香客問(wèn)我,道長(zhǎng)卡辰,這世上最難降的妖魔是什么胞皱? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮九妈,結(jié)果婚禮上反砌,老公的妹妹穿的比我還像新娘。我一直安慰自己萌朱,他們只是感情好宴树,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著晶疼,像睡著了一般酒贬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上翠霍,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天锭吨,我揣著相機(jī)與錄音,去河邊找鬼寒匙。 笑死零如,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的锄弱。 我是一名探鬼主播考蕾,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼会宪!你這毒婦竟也來(lái)了肖卧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤掸鹅,失蹤者是張志新(化名)和其女友劉穎塞帐,沒想到半個(gè)月后沟沙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡壁榕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了赎瞎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片牌里。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖务甥,靈堂內(nèi)的尸體忽然破棺而出牡辽,到底是詐尸還是另有隱情,我是刑警寧澤敞临,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布态辛,位于F島的核電站,受9級(jí)特大地震影響挺尿,放射性物質(zhì)發(fā)生泄漏奏黑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一编矾、第九天 我趴在偏房一處隱蔽的房頂上張望熟史。 院中可真熱鬧,春花似錦窄俏、人聲如沸蹂匹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)限寞。三九已至,卻和暖如春仰坦,著一層夾襖步出監(jiān)牢的瞬間履植,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工缎岗, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留静尼,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓传泊,卻偏偏與公主長(zhǎng)得像鼠渺,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子眷细,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

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