Keras的函數式模型爲Model
,即廣義的擁有輸入和輸出的模型,咱們使用Model
來初始化一個函數式模型html
from keras.models import Model from keras.layers import Input, Dense a = Input(shape=(32,)) b = Dense(32)(a) model = Model(inputs=a, outputs=b)
在這裏,咱們的模型以a
爲輸入,以b
爲輸出,一樣咱們能夠構造擁有多輸入和多輸出的模型python
model = Model(inputs=[a1, a2], outputs=[b1, b2, b3])
model.layers
:組成模型圖的各個層model.inputs
:模型的輸入張量列表model.outputs
:模型的輸出張量列表compile(self, optimizer, loss, metrics=None, loss_weights=None, sample_weight_mode=None, weighted_metrics=None, target_tensors=None)
本函數編譯模型以供訓練,參數有後端
optimizer:優化器,爲預約義優化器名或優化器對象,參考優化器多線程
loss:損失函數,爲預約義損失函數名或一個目標函數,參考損失函數函數
metrics:列表,包含評估模型在訓練和測試時的性能的指標,典型用法是metrics=['accuracy']
若是要在多輸出模型中爲不一樣的輸出指定不一樣的指標,可像該參數傳遞一個字典,例如metrics={'ouput_a': 'accuracy'}
性能
sample_weight_mode:若是你須要按時間步爲樣本賦權(2D權矩陣),將該值設爲「temporal」。默認爲「None」,表明按樣本賦權(1D權)。若是模型有多個輸出,能夠向該參數傳入指定sample_weight_mode的字典或列表。在下面fit
函數的解釋中有相關的參考內容。測試
weighted_metrics: metrics列表,在訓練和測試過程當中,這些metrics將由sample_weight
或clss_weight
計算並賦權優化
target_tensors: 默認狀況下,Keras將爲模型的目標建立一個佔位符,該佔位符在訓練過程當中將被目標數據代替。若是你想使用本身的目標張量(相應的,Keras將不會在訓練時指望爲這些目標張量載入外部的numpy數據),你能夠經過該參數手動指定。目標張量能夠是一個單獨的張量(對應於單輸出模型),也能夠是一個張量列表,或者一個name->tensor的張量字典。lua
kwargs:使用TensorFlow做爲後端請忽略該參數,若使用Theano/CNTK做爲後端,kwargs的值將會傳遞給 K.function。若是使用TensorFlow爲後端,這裏的值會被傳給tf.Session.runspa
當爲參數傳入非法值時會拋出異常
【Tips】若是你只是載入模型並利用其predict,能夠不用進行compile。在Keras中,compile主要完成損失函數和優化器的一些配置,是爲訓練服務的。predict會在內部進行符號函數的編譯工做(經過調用_make_predict_function生成函數),
fit(self, x=None, y=None, batch_size=None, epochs=1, verbose=1, callbacks=None, validation_split=0.0, validation_data=None, shuffle=True, class_weight=None, sample_weight=None, initial_epoch=0, steps_per_epoch=None, validation_steps=None)
本函數用以訓練模型,參數有:
x:輸入數據。若是模型只有一個輸入,那麼x的類型是numpy array,若是模型有多個輸入,那麼x的類型應當爲list,list的元素是對應於各個輸入的numpy array。若是模型的每一個輸入都有名字,則能夠傳入一個字典,將輸入名與其輸入數據對應起來。
y:標籤,numpy array。若是模型有多個輸出,能夠傳入一個numpy array的list。若是模型的輸出擁有名字,則能夠傳入一個字典,將輸出名與其標籤對應起來。
batch_size:整數,指定進行梯度降低時每一個batch包含的樣本數。訓練時一個batch的樣本會被計算一次梯度降低,使目標函數優化一步。
epochs:整數,訓練終止時的epoch值,訓練將在達到該epoch值時中止,當沒有設置initial_epoch時,它就是訓練的總輪數,不然訓練的總輪數爲epochs - inital_epoch
verbose:日誌顯示,0爲不在標準輸出流輸出日誌信息,1爲輸出進度條記錄,2爲每一個epoch輸出一行記錄
callbacks:list,其中的元素是keras.callbacks.Callback
的對象。這個list中的回調函數將會在訓練過程當中的適當時機被調用,參考回調函數
validation_split:0~1之間的浮點數,用來指定訓練集的必定比例數據做爲驗證集。驗證集將不參與訓練,並在每一個epoch結束後測試的模型的指標,如損失函數、精確度等。注意,validation_split的劃分在shuffle以後,所以若是你的數據自己是有序的,須要先手工打亂再指定validation_split,不然可能會出現驗證集樣本不均勻。
validation_data:形式爲(X,y)或(X,y,sample_weights)的tuple,是指定的驗證集。此參數將覆蓋validation_spilt。
shuffle:布爾值,表示是否在訓練過程當中每一個epoch前隨機打亂輸入樣本的順序。
class_weight:字典,將不一樣的類別映射爲不一樣的權值,該參數用來在訓練過程當中調整損失函數(只能用於訓練)。該參數在處理非平衡的訓練數據(某些類的訓練樣本數不多)時,可使得損失函數對樣本數不足的數據更加關注。
sample_weight:權值的numpy array,用於在訓練時調整損失函數(僅用於訓練)。能夠傳遞一個1D的與樣本等長的向量用於對樣本進行1對1的加權,或者在面對時序數據時,傳遞一個的形式爲(samples,sequence_length)的矩陣來爲每一個時間步上的樣本賦不一樣的權。這種狀況下請肯定在編譯模型時添加了sample_weight_mode='temporal'
。
initial_epoch: 從該參數指定的epoch開始訓練,在繼續以前的訓練時有用。
steps_per_epoch: 一個epoch包含的步數(每一步是一個batch的數據送入),當使用如TensorFlow數據Tensor之類的輸入張量進行訓練時,默認的None表明自動分割,即數據集樣本數/batch樣本數。
輸入數據與規定數據不匹配時會拋出錯誤
fit
函數返回一個History
的對象,其History.history
屬性記錄了損失函數和其餘指標的數值隨epoch變化的狀況,若是有驗證集的話,也包含了驗證集的這些指標變化狀況
evaluate(self, x, y, batch_size=32, verbose=1, sample_weight=None)
本函數按batch計算在某些輸入數據上模型的偏差,其參數有:
x:輸入數據,與fit
同樣,是numpy array或numpy array的list
y:標籤,numpy array
batch_size:整數,含義同fit
的同名參數
verbose:含義同fit
的同名參數,但只能取0或1
sample_weight:numpy array,含義同fit
的同名參數
本函數返回一個測試偏差的標量值(若是模型沒有其餘評價指標),或一個標量的list(若是模型還有其餘的評價指標)。model.metrics_names
將給出list中各個值的含義。
若是沒有特殊說明,如下函數的參數均保持與fit
的同名參數相同的含義
若是沒有特殊說明,如下函數的verbose參數(若是有)均只能取0或1
predict(self, x, batch_size=32, verbose=0)
本函數按batch得到輸入數據對應的輸出,其參數有:
函數的返回值是預測值的numpy array
train_on_batch(self, x, y, class_weight=None, sample_weight=None)
本函數在一個batch的數據上進行一次參數更新
函數返回訓練偏差的標量值或標量值的list,與evaluate的情形相同。
test_on_batch(self, x, y, sample_weight=None)
本函數在一個batch的樣本上對模型進行評估
函數的返回與evaluate的情形相同
predict_on_batch(self, x)
本函數在一個batch的樣本上對模型進行測試
函數返回模型在一個batch上的預測結果
fit_generator(self, generator, steps_per_epoch, epochs=1, verbose=1, callbacks=None, validation_data=None, validation_steps=None, class_weight=None, max_q_size=10, workers=1, pickle_safe=False, initial_epoch=0)
利用Python的生成器,逐個生成數據的batch並進行訓練。生成器與模型將並行執行以提升效率。例如,該函數容許咱們在CPU上進行實時的數據提高,同時在GPU上進行模型訓練
函數的參數是:
generator:生成器函數,生成器的輸出應該爲:
一個形如(inputs,targets)的tuple
一個形如(inputs, targets,sample_weight)的tuple。全部的返回值都應該包含相同數目的樣本。生成器將無限在數據集上循環。每一個epoch以通過模型的樣本數達到samples_per_epoch
時,記一個epoch結束
steps_per_epoch:整數,當生成器返回steps_per_epoch
次數據時計一個epoch結束,執行下一個epoch
epochs:整數,數據迭代的輪數
verbose:日誌顯示,0爲不在標準輸出流輸出日誌信息,1爲輸出進度條記錄,2爲每一個epoch輸出一行記錄
validation_data:具備如下三種形式之一
生成驗證集的生成器
一個形如(inputs,targets)的tuple
一個形如(inputs,targets,sample_weights)的tuple
validation_steps: 當validation_data爲生成器時,本參數指定驗證集的生成器返回次數
class_weight:規定類別權重的字典,將類別映射爲權重,經常使用於處理樣本不均衡問題。
sample_weight:權值的numpy array,用於在訓練時調整損失函數(僅用於訓練)。能夠傳遞一個1D的與樣本等長的向量用於對樣本進行1對1的加權,或者在面對時序數據時,傳遞一個的形式爲(samples,sequence_length)的矩陣來爲每一個時間步上的樣本賦不一樣的權。這種狀況下請肯定在編譯模型時添加了sample_weight_mode='temporal'
。
workers:最大進程數
max_q_size:生成器隊列的最大容量
pickle_safe: 若爲真,則使用基於進程的線程。因爲該實現依賴多進程,不能傳遞non picklable(沒法被pickle序列化)的參數到生成器中,由於沒法輕易將它們傳入子進程中。
initial_epoch: 從該參數指定的epoch開始訓練,在繼續以前的訓練時有用。
函數返回一個History
對象
例子
def generate_arrays_from_file(path): while 1: f = open(path) for line in f: # create numpy arrays of input data # and labels, from each line in the file x1, x2, y = process_line(line) yield ({'input_1': x1, 'input_2': x2}, {'output': y}) f.close() model.fit_generator(generate_arrays_from_file('/my_file.txt'), steps_per_epoch=10000, epochs=10)
evaluate_generator(self, generator, steps, max_q_size=10, workers=1, pickle_safe=False)
本函數使用一個生成器做爲數據源,來評估模型,生成器應返回與test_on_batch
的輸入數據相同類型的數據。
函數的參數是:
generator:生成輸入batch數據的生成器
val_samples:生成器應該返回的總樣本數
steps:生成器要返回數據的輪數
max_q_size:生成器隊列的最大容量
nb_worker:使用基於進程的多線程處理時的進程數
pickle_safe:若設置爲True,則使用基於進程的線程。注意由於它的實現依賴於多進程處理,不可傳遞不可pickle的參數到生成器中,由於它們不能輕易的傳遞到子進程中。
predict_generator(self, generator, steps, max_queue_size=10, workers=1, use_multiprocessing=False, verbose=0)
從一個生成器上獲取數據並進行預測,生成器應返回與predict_on_batch
輸入相似的數據
函數的參數是:
generator:生成輸入batch數據的生成器
val_samples:生成器應該返回的總樣本數
max_q_size:生成器隊列的最大容量
nb_worker:使用基於進程的多線程處理時的進程數
pickle_safe:若設置爲True,則使用基於進程的線程。注意由於它的實現依賴於多進程處理,不可傳遞不可pickle的參數到生成器中,由於它們不能輕易的傳遞到子進程中。
轉載於:https://blog.csdn.net/weixin_30716141/article/details/99481089?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control