1. 程式人生 > 實用技巧 >Keras官方中文文件:函式式模型API

Keras官方中文文件:函式式模型API

函式式模型介面

Keras的函式式模型為Model,即廣義的擁有輸入和輸出的模型,我們使用Model來初始化一個函式式模型

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為輸出,同樣我們可以構造擁有多輸入和多輸出的模型

model = Model(inputs=[a1, a2], outputs=[b1, b2, b3])

常用Model屬性

  • model.layers:組成模型圖的各個層
  • model.inputs:模型的輸入張量列表
  • model.outputs:模型的輸出張量列表

Model模型方法

compile

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的張量字典。

  • kwargs:使用TensorFlow作為後端請忽略該引數,若使用Theano/CNTK作為後端,kwargs的值將會傳遞給 K.function。如果使用TensorFlow為後端,這裡的值會被傳給tf.Session.run

當為引數傳入非法值時會丟擲異常

【Tips】如果你只是載入模型並利用其predict,可以不用進行compile。在Keras中,compile主要完成損失函式和優化器的一些配置,是為訓練服務的。predict會在內部進行符號函式的編譯工作(通過呼叫_make_predict_function生成函式),

fit

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樣本數。

  • validation_steps: 僅當steps_per_epoch被指定時有用,在驗證集上的step總數。

輸入資料與規定資料不匹配時會丟擲錯誤

fit函式返回一個History的物件,其History.history屬性記錄了損失函式和其他指標的數值隨epoch變化的情況,如果有驗證集的話,也包含了驗證集的這些指標變化情況

evaluate

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

predict(self, x, batch_size=32, verbose=0)

  

本函式按batch獲得輸入資料對應的輸出,其引數有:

函式的返回值是預測值的numpy array

train_on_batch

train_on_batch(self, x, y, class_weight=None, sample_weight=None)

  

本函式在一個batch的資料上進行一次引數更新

函式返回訓練誤差的標量值或標量值的list,與evaluate的情形相同。

test_on_batch

test_on_batch(self, x, y, sample_weight=None)

  

本函式在一個batch的樣本上對模型進行評估

函式的返回與evaluate的情形相同


predict_on_batch

predict_on_batch(self, x)

  

本函式在一個batch的樣本上對模型進行測試

函式返回模型在一個batch上的預測結果


fit_generator

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

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

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