歡迎您光臨本站 註冊首頁

generator()和model.fit()的區別說明

←手機掃碼閱讀     e36605 @ 2020-06-18 , reply:0

首先Keras中的fit()函式傳入的x_train和y_train是被完整的載入進記憶體的,當然用起來很方便,但是如果我們資料量很大,那麼是不可能將所有資料載入記憶體的,必將導致記憶體洩漏,這時候我們可以用fit_generator函式來進行訓練。

keras中文文件

fit

fit(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: 訓練資料的 Numpy 陣列(如果模型只有一個輸入), 或者是 Numpy 陣列的列表(如果模型有多個輸入)。 如果模型中的輸入層被命名,你也可以傳遞一個字典,將輸入層名稱對映到 Numpy 陣列。 如果從本地框架張量饋送(例如 TensorFlow 資料張量)資料,x 可以是 None(預設)。

y: 目標(標籤)資料的 Numpy 陣列(如果模型只有一個輸出), 或者是 Numpy 陣列的列表(如果模型有多個輸出)。 如果模型中的輸出層被命名,你也可以傳遞一個字典,將輸出層名稱對映到 Numpy 陣列。 如果從本地框架張量饋送(例如 TensorFlow 資料張量)資料,y 可以是 None(預設)。

batch_size: 整數或 None。每次梯度更新的樣本數。如果未指定,預設為 32。

epochs: 整數。訓練模型迭代輪次。一個輪次是在整個 x 和 y 上的一輪迭代。 請注意,與 initial_epoch 一起,epochs 被理解為 「最終輪次」。模型並不是訓練了 epochs 輪,而是到第 epochs 輪停止訓練。

verbose: 0, 1 或 2。日誌顯示模式。 0 = 安靜模式, 1 = 進度條, 2 = 每輪一行。

callbacks: 一系列的 keras.callbacks.Callback 例項。一系列可以在訓練時使用的回撥函式。 詳見 callbacks。

validation_split: 0 和 1 之間的浮點數。用作驗證集的訓練資料的比例。 模型將分出一部分不會被訓練的驗證資料,並將在每一輪結束時評估這些驗證資料的誤差和任何其他模型指標。 驗證資料是混洗之前 x 和y 資料的最後一部分樣本中。

validation_data: 元組 (x_val,y_val) 或元組 (x_val,y_val,val_sample_weights), 用來評估損失,以及在每輪結束時的任何模型度量指標。 模型將不會在這個資料上進行訓練。這個引數會覆蓋 validation_split。

shuffle: 布林值(是否在每輪迭代之前混洗資料)或者 字串 (batch)。 batch 是處理 HDF5 資料限制的特殊選項,它對一個 batch 內部的資料進行混洗。 當 steps_per_epoch 非 None 時,這個引數無效。

class_weight: 可選的字典,用來對映類索引(整數)到權重(浮點)值,用於加權損失函式(僅在訓練期間)。 這可能有助於告訴模型 「更多關注」來自代表性不足的類的樣本。

sample_weight: 訓練樣本的可選 Numpy 權重陣列,用於對損失函式進行加權(僅在訓練期間)。 您可以傳遞與輸入樣本長度相同的平坦(1D)Numpy 陣列(權重和樣本之間的 1:1 對映), 或者在時序資料的情況下,可以傳遞尺寸為 (samples, sequence_length) 的 2D 陣列,以對每個樣本的每個時間步施加不同的權重。 在這種情況下,你應該確保在 compile() 中指定 sample_weight_mode="temporal"。

initial_epoch: 整數。開始訓練的輪次(有助於恢復之前的訓練)。

steps_per_epoch: 整數或 None。 在宣告一個輪次完成並開始下一個輪次之前的總步數(樣品批次)。 使用 TensorFlow 資料張量等輸入張量進行訓練時,預設值 None 等於資料集中樣本的數量除以 batch 的大小,如果無法確定,則為 1。

validation_steps: 只有在指定了 steps_per_epoch 時才有用。停止前要驗證的總步數(批次樣本)。

返回

一個 History 物件。其 History.history 屬性是連續 epoch 訓練損失和評估值,以及驗證集損失和評估值的記錄(如果適用)。

異常

RuntimeError: 如果模型從未編譯。

ValueError: 在提供的輸入資料與模型期望的不匹配的情況下。

fit_generator

fit_generator(generator, steps_per_epoch=None, epochs=1, verbose=1, callbacks=None, validation_data=None, validation_steps=None, class_weight=None, max_queue_size=10, workers=1, use_multiprocessing=False, shuffle=True, initial_epoch=0)

使用 Python 生成器(或 Sequence 例項)逐批生成的資料,按批次訓練模型。

生成器與模型並行執行,以提高效率。 例如,這可以讓你在 CPU 上對影象進行實時資料增強,以在 GPU 上訓練模型。

keras.utils.Sequence 的使用可以保證資料的順序, 以及當 use_multiprocessing=True 時 ,保證每個輸入在每個 epoch 只使用一次。

引數

generator: 一個生成器,或者一個 Sequence (keras.utils.Sequence) 物件的例項, 以在使用多程序時避免資料的重複。 生成器的輸出應該為以下之一:

一個 (inputs, targets) 元組

一個 (inputs, targets, sample_weights) 元組。

這個元組(生成器的單個輸出)組成了單個的 batch。 因此,這個元組中的所有陣列長度必須相同(與這一個 batch 的大小相等)。 不同的 batch 可能大小不同。 例如,一個 epoch 的最後一個 batch 往往比其他 batch 要小, 如果資料集的尺寸不能被 batch size 整除。 生成器將無限地在資料集上迴圈。當執行到第 steps_per_epoch 時,記一個 epoch 結束。

steps_per_epoch: 在宣告一個 epoch 完成並開始下一個 epoch 之前從 generator 產生的總步數(批次樣本)。 它通常應該等於你的資料集的樣本數量除以批次大小。 對於 Sequence,它是可選的:如果未指定,將使用len(generator) 作為步數。

epochs: 整數。訓練模型的迭代總輪數。一個 epoch 是對所提供的整個資料的一輪迭代,如 steps_per_epoch 所定義。注意,與 initial_epoch 一起使用,epoch 應被理解為「最後一輪」。模型沒有經歷由 epochs 給出的多次迭代的訓練,而僅僅是直到達到索引 epoch 的輪次。

verbose: 0, 1 或 2。日誌顯示模式。 0 = 安靜模式, 1 = 進度條, 2 = 每輪一行。

callbacks: keras.callbacks.Callback 例項的列表。在訓練時呼叫的一系列回撥函式。

validation_data: 它可以是以下之一:

驗證資料的生成器或 Sequence 例項

一個 (inputs, targets) 元組

一個 (inputs, targets, sample_weights) 元組。

在每個 epoch 結束時評估損失和任何模型指標。該模型不會對此資料進行訓練。

validation_steps: 僅當 validation_data 是一個生成器時才可用。 在停止前 generator 生成的總步數(樣本批數)。 對於 Sequence,它是可選的:如果未指定,將使用 len(generator) 作為步數。

class_weight: 可選的將類索引(整數)對映到權重(浮點)值的字典,用於加權損失函式(僅在訓練期間)。 這可以用來告訴模型「更多地關注」來自代表性不足的類的樣本。

max_queue_size: 整數。生成器佇列的最大尺寸。 如未指定,max_queue_size 將預設為 10。

workers: 整數。使用的最大程序數量,如果使用基於程序的多執行緒。 如未指定,workers 將預設為 1。如果為 0,將在主執行緒上執行生成器。

use_multiprocessing: 布林值。如果 True,則使用基於程序的多執行緒。 如未指定, use_multiprocessing 將預設為 False。 請注意,由於此實現依賴於多程序,所以不應將不可傳遞的引數傳遞給生成器,因為它們不能被輕易地傳遞給子程序。

shuffle: 是否在每輪迭代之前打亂 batch 的順序。 只能與 Sequence (keras.utils.Sequence) 例項同用。

initial_epoch: 開始訓練的輪次(有助於恢復之前的訓練)。

返回

一個 History 物件。其 History.history 屬性是連續 epoch 訓練損失和評估值,以及驗證集損失和評估值的記錄(如果適用)。

異常

ValueError: 如果生成器生成的資料格式不正確。

  def generate_arrays_from_file(path):   while True:   with open(path) as f:   for line in f:   # 從檔案中的每一行生成輸入資料和標籤的 numpy 陣列,   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)

 

總結:

在使用fit函式的時候,需要有batch_size,但是在使用fit_generator時需要有steps_per_epoch

 

   


[e36605 ] generator()和model.fit()的區別說明已經有385次圍觀

http://coctec.com/docs/program/show-post-238981.html