keras訓(xùn)練
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
fit( self , x, y, batch_size = 32 , nb_epoch = 10 , verbose = 1 , callbacks = [], validation_split = 0.0 , validation_data = None , shuffle = True , class_weight = None , sample_weight = None ) |
1. x:輸入數(shù)據(jù)。如果模型只有一個(gè)輸入,那么x的類(lèi)型是numpy array,如果模型有多個(gè)輸入,那么x的類(lèi)型應(yīng)當(dāng)為list,list的元素是對(duì)應(yīng)于各個(gè)輸入的numpy array。如果模型的每個(gè)輸入都有名字,則可以傳入一個(gè)字典,將輸入名與其輸入數(shù)據(jù)對(duì)應(yīng)起來(lái)。
2. y:標(biāo)簽,numpy array。如果模型有多個(gè)輸出,可以傳入一個(gè)numpy array的list。如果模型的輸出擁有名字,則可以傳入一個(gè)字典,將輸出名與其標(biāo)簽對(duì)應(yīng)起來(lái)。
3. batch_size:整數(shù),指定進(jìn)行梯度下降時(shí)每個(gè)batch包含的樣本數(shù)。訓(xùn)練時(shí)一個(gè)batch的樣本會(huì)被計(jì)算一次梯度下降,使目標(biāo)函數(shù)優(yōu)化一步。
4. nb_epoch:整數(shù),訓(xùn)練的輪數(shù),訓(xùn)練數(shù)據(jù)將會(huì)被遍歷nb_epoch次。Keras中nb開(kāi)頭的變量均為"number of"的意思
5. verbose:日志顯示,0為不在標(biāo)準(zhǔn)輸出流輸出日志信息,1為輸出進(jìn)度條記錄,2為每個(gè)epoch輸出一行記錄
6. callbacks:list,其中的元素是keras.callbacks.Callback的對(duì)象。這個(gè)list中的回調(diào)函數(shù)將會(huì)在訓(xùn)練過(guò)程中的適當(dāng)時(shí)機(jī)被調(diào)用,參考回調(diào)函數(shù)
7. validation_split:0~1之間的浮點(diǎn)數(shù),用來(lái)指定訓(xùn)練集的一定比例數(shù)據(jù)作為驗(yàn)證集。驗(yàn)證集將不參與訓(xùn)練,并在每個(gè)epoch結(jié)束后測(cè)試的模型的指標(biāo),如損失函數(shù)、精確度等。
8. validation_data:形式為(X,y)或(X,y,sample_weights)的tuple,是指定的驗(yàn)證集。此參數(shù)將覆蓋validation_spilt。
9. shuffle:布爾值,表示是否在訓(xùn)練過(guò)程中每個(gè)epoch前隨機(jī)打亂輸入樣本的順序。
10. class_weight:字典,將不同的類(lèi)別映射為不同的權(quán)值,該參數(shù)用來(lái)在訓(xùn)練過(guò)程中調(diào)整損失函數(shù)(只能用于訓(xùn)練)。該參數(shù)在處理非平衡的訓(xùn)練數(shù)據(jù)(某些類(lèi)的訓(xùn)練樣本數(shù)很少)時(shí),可以使得損失函數(shù)對(duì)樣本數(shù)不足的數(shù)據(jù)更加關(guān)注。
11. sample_weight:權(quán)值的numpy array,用于在訓(xùn)練時(shí)調(diào)整損失函數(shù)(僅用于訓(xùn)練)。可以傳遞一個(gè)1D的與樣本等長(zhǎng)的向量用于對(duì)樣本進(jìn)行1對(duì)1的加權(quán),或者在面對(duì)時(shí)序數(shù)據(jù)時(shí),傳遞一個(gè)的形式為(samples,sequence_length)的矩陣來(lái)為每個(gè)時(shí)間步上的樣本賦不同的權(quán)。這種情況下請(qǐng)確定在編譯模型時(shí)添加了sample_weight_mode='temporal'。
fit函數(shù)返回一個(gè)History的對(duì)象,其History.history屬性記錄了損失函數(shù)和其他指標(biāo)的數(shù)值隨epoch變化的情況,如果有驗(yàn)證集的話,也包含了驗(yàn)證集的這些指標(biāo)變化情況。
保存模型結(jié)構(gòu)、訓(xùn)練出來(lái)的權(quán)重、及優(yōu)化器狀態(tài)
keras 的 callback參數(shù)可以幫助我們實(shí)現(xiàn)在訓(xùn)練過(guò)程中的適當(dāng)時(shí)機(jī)被調(diào)用。實(shí)現(xiàn)實(shí)時(shí)保存訓(xùn)練模型以及訓(xùn)練參數(shù)。
1
2
3
4
5
6
7
8
9
|
keras.callbacks.ModelCheckpoint( filepath, monitor = 'val_loss' , verbose = 0 , save_best_only = False , save_weights_only = False , mode = 'auto' , period = 1 ) |
1. filename:字符串,保存模型的路徑
2. monitor:需要監(jiān)視的值
3. verbose:信息展示模式,0或1
4. save_best_only:當(dāng)設(shè)置為T(mén)rue時(shí),將只保存在驗(yàn)證集上性能最好的模型
5. mode:‘auto',‘min',‘max'之一,在save_best_only=True時(shí)決定性能最佳模型的評(píng)判準(zhǔn)則,例如,當(dāng)監(jiān)測(cè)值為val_acc時(shí),模式應(yīng)為max,當(dāng)檢測(cè)值為val_loss時(shí),模式應(yīng)為min。在auto模式下,評(píng)價(jià)準(zhǔn)則由被監(jiān)測(cè)值的名字自動(dòng)推斷。
6. save_weights_only:若設(shè)置為T(mén)rue,則只保存模型權(quán)重,否則將保存整個(gè)模型(包括模型結(jié)構(gòu),配置信息等)
7. period:CheckPoint之間的間隔的epoch數(shù)
當(dāng)驗(yàn)證損失不再繼續(xù)降低時(shí),如何中斷訓(xùn)練?當(dāng)監(jiān)測(cè)值不再改善時(shí)中止訓(xùn)練
用EarlyStopping回調(diào)函數(shù)
1
2
3
4
5
6
7
8
|
from keras.callbacksimport EarlyStopping keras.callbacks.EarlyStopping( monitor = 'val_loss' , patience = 0 , verbose = 0 , mode = 'auto' ) |
model.fit(X, y, validation_split=0.2, callbacks=[early_stopping])
1. monitor:需要監(jiān)視的量
2. patience:當(dāng)early stop被激活(如發(fā)現(xiàn)loss相比上一個(gè)epoch訓(xùn)練沒(méi)有下降),則經(jīng)過(guò)patience個(gè)epoch后停止訓(xùn)練。
3. verbose:信息展示模式
4. mode:‘auto',‘min',‘max'之一,在min模式下,如果檢測(cè)值停止下降則中止訓(xùn)練。在max模式下,當(dāng)檢測(cè)值不再上升則停止訓(xùn)練。
學(xué)習(xí)率動(dòng)態(tài)調(diào)整1
keras.callbacks.LearningRateScheduler(schedule)
schedule:函數(shù),該函數(shù)以epoch號(hào)為參數(shù)(從0算起的整數(shù)),返回一個(gè)新學(xué)習(xí)率(浮點(diǎn)數(shù))
也可以讓keras自動(dòng)調(diào)整學(xué)習(xí)率
1
2
3
4
5
6
7
8
9
10
|
keras.callbacks.ReduceLROnPlateau( monitor = 'val_loss' , factor = 0.1 , patience = 10 , verbose = 0 , mode = 'auto' , epsilon = 0.0001 , cooldown = 0 , min_lr = 0 ) |
1. monitor:被監(jiān)測(cè)的量
2. factor:每次減少學(xué)習(xí)率的因子,學(xué)習(xí)率將以lr = lr*factor的形式被減少
3. patience:當(dāng)patience個(gè)epoch過(guò)去而模型性能不提升時(shí),學(xué)習(xí)率減少的動(dòng)作會(huì)被觸發(fā)
4. mode:‘auto',‘min',‘max'之一,在min模式下,如果檢測(cè)值觸發(fā)學(xué)習(xí)率減少。在max模式下,當(dāng)檢測(cè)值不再上升則觸發(fā)學(xué)習(xí)率減少。
5. epsilon:閾值,用來(lái)確定是否進(jìn)入檢測(cè)值的“平原區(qū)”
6. cooldown:學(xué)習(xí)率減少后,會(huì)經(jīng)過(guò)cooldown個(gè)epoch才重新進(jìn)行正常操作
7. min_lr:學(xué)習(xí)率的下限
當(dāng)學(xué)習(xí)停滯時(shí),減少2倍或10倍的學(xué)習(xí)率常常能獲得較好的效果
學(xué)習(xí)率動(dòng)態(tài)2
1
2
3
4
5
6
7
8
9
|
def step_decay(epoch): initial_lrate = 0.01 drop = 0.5 epochs_drop = 10.0 lrate = initial_lrate * math. pow (drop,math.floor(( 1 + epoch) / epochs_drop)) return lrate lrate = LearningRateScheduler(step_decay) sgd = SGD(lr = 0.0 , momentum = 0.9 , decay = 0.0 , nesterov = False ) model.fit(train_set_x, train_set_y, validation_split = 0.1 , nb_epoch = 200 , batch_size = 256 , callbacks = [lrate]) |
如何記錄每一次epoch的訓(xùn)練/驗(yàn)證損失/準(zhǔn)確度?
Model.fit函數(shù)會(huì)返回一個(gè) History 回調(diào),該回調(diào)有一個(gè)屬性history包含一個(gè)封裝有連續(xù)損失/準(zhǔn)確的lists。代碼如下:
hist = model.fit(X, y,validation_split=0.2)
print(hist.history)
Keras輸出的loss,val這些值如何保存到文本中去
Keras中的fit函數(shù)會(huì)返回一個(gè)History對(duì)象,它的History.history屬性會(huì)把之前的那些值全保存在里面,如果有驗(yàn)證集的話,也包含了驗(yàn)證集的這些指標(biāo)變化情況,具體寫(xiě)法
1
2
3
|
hist = model.fit(train_set_x,train_set_y,batch_size = 256 ,shuffle = True ,nb_epoch = nb_epoch,validation_split = 0.1 ) with open ( 'log_sgd_big_32.txt' , 'w' ) as f: f.write( str (hist.history)) |
示例,多個(gè)回調(diào)函數(shù)用逗號(hào)隔開(kāi)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
# checkpoint checkpointer = ModelCheckpoint(filepath = "./checkpoint.hdf5" , verbose = 1 ) # learning rate adjust dynamic lrate = ReduceLROnPlateau(min_lr = 0.00001 ) answer. compile (optimizer = 'rmsprop' , loss = 'categorical_crossentropy' , metrics = [ 'accuracy' ]) # Note: you could use a Graph model to avoid repeat the input twice answer.fit( [inputs_train, queries_train, inputs_train], answers_train, batch_size = 32 , nb_epoch = 5000 , validation_data = ([inputs_test, queries_test, inputs_test], answers_test), callbacks = [checkpointer, lrate] ) |
keras回調(diào)函數(shù)中的Tensorboard
1
2
3
4
5
6
7
|
keras.callbacks.TensorBoard(log_dir = './Graph' , histogram_freq = 0 , write_graph = True , write_images = True ) tbCallBack = keras.callbacks.TensorBoard(log_dir = './Graph' , histogram_freq = 0 , write_graph = True , write_images = True ) ... model.fit(...inputs and parameters..., callbacks = [tbCallBack]) tensorboard - - logdir path_to_current_dir / Graph |
或者
1
2
3
4
5
6
7
8
9
10
11
|
from keras.callbacks import TensorBoard tensorboard = TensorBoard(log_dir = './logs' , histogram_freq = 0 , write_graph = True , write_images = False ) # define model model.fit(X_train, Y_train, batch_size = batch_size, epochs = nb_epoch, validation_data = (X_test, Y_test), shuffle = True , callbacks = [tensorboard]) |
補(bǔ)充知識(shí):Keras中的回調(diào)函數(shù)(callback)的使用與介紹
以前我在訓(xùn)練的時(shí)候,都是直接設(shè)定一個(gè)比較大的epoch,跑完所有的epoch之后再根據(jù)數(shù)據(jù)去調(diào)整模型與參數(shù)。這樣做會(huì)比較耗時(shí),例如說(shuō)訓(xùn)練在某一個(gè)epoch開(kāi)始已經(jīng)過(guò)擬合了,后面繼續(xù)訓(xùn)練意義就不大了。
在書(shū)上看到的callback函數(shù)很好的解決了這個(gè)問(wèn)題,它能夠監(jiān)測(cè)訓(xùn)練過(guò)程中的loss或者acc這些指標(biāo),一旦觀察到損失不再改善之后,就可以中止訓(xùn)練,節(jié)省時(shí)間。下面記錄一下
介紹:
(選自《python深度學(xué)習(xí)》)
回調(diào)函數(shù)(callback)是在調(diào)用fit時(shí)傳入模型的一個(gè)對(duì)象,它在訓(xùn)練過(guò)程中的不同時(shí)間點(diǎn)都會(huì)被模型調(diào)用。它可以訪問(wèn)關(guān)于模型狀態(tài)與性能的所有可用數(shù)據(jù),還可以采取行動(dòng):中斷訓(xùn)練、保存模型、加載一組不同的權(quán)重或改變模型的狀態(tài)。
部分回調(diào)函數(shù):
1.ModelCheckpoint與EarlyStopping
監(jiān)控目標(biāo)若在指定輪數(shù)內(nèi)不再改善,可利用EarlyStopping來(lái)中斷訓(xùn)練。
可配合ModelCheckpoint使用,該回調(diào)函數(shù)可不斷地保存模型,亦可以只保存某一epoch最佳性能模型
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
import keras callbacks_list = [ keras.callbacks.EarlyStopping( monitor = 'acc' , #監(jiān)控精度 patience = 5 , #5輪內(nèi)不改善就中止 ), keras.callbacks.ModelCheckpoint( filepath = 'C:/apple/my_model.h5' , #模型保存路徑 monitor = 'val_loss' , #檢測(cè)驗(yàn)證集損失值 save_best_only = True #是否只保存最佳模型 ) ] model. compile (optimizer = 'rmsprop' , loss = 'binary_crossentropy' , metrics = [ 'acc' ]) model.fit(x,y, epochs = 10 , batch_size = 32 , callbacks = callbacks_list, #在這里放入callback函數(shù) validation_data = (x_val,y_val) ) |
2.ReduceLROnPlateau回調(diào)函數(shù)
如果驗(yàn)證損失不再改善,可以使用該回調(diào)函數(shù)來(lái)降低學(xué)習(xí)率。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
import keras callbacks_list = [ keras.callbacks.ReduceLROnPlateau( monitor = 'val_loss' , #監(jiān)控精度 patienece = 5 , # 5輪內(nèi)不改善就改變 factor = 0.1 #學(xué)習(xí)率變?yōu)樵瓉?lái)的0.1 ) ] model. compile (optimizer = 'rmsprop' , loss = 'binary_crossentropy' , metrics = [ 'acc' ]) model.fit(x,y, epochs = 10 , batch_size = 32 , callbacks = callbacks_list, #在這里放入callback函數(shù) validation_data = (x_val,y_val) ) |
以上這篇基于keras中的回調(diào)函數(shù)用法說(shuō)明就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持服務(wù)器之家。
原文鏈接:https://blog.csdn.net/jiandanjinxin/article/details/77097910