[深度学习] Keras 如何使用fit和fit_generator
介紹
在本教程中,您將了解Keras?.fit和.fit_generator函數的工作原理,包括它們之間的差異。為了幫助您獲得實踐經驗,我已經提供了一個完整的示例,向您展示如何從頭開始實現Keras數據生成器。
Keras深度學習庫包括可用于訓練您自己的模型:
- .fit
- .fit_generator
如果你是Keras和深度學習的新手,在試圖確定你應該使用哪種函數時,你可能會覺得有點不知所措。如果你需要使用你自己的自定義數據,這種混亂只會更加復雜。
為了幫助掀開關于Keras fit和fit_generator函數的迷云,我將花費本教程討論:
- Keras的.fit,.fit_generator函數之間的區別
- 在訓練自己的深度學習模型時,何時使用每個函數
- 如何實現自己的Keras數據生成器,并在使用.fit_generator訓練模型時使用它
- 在訓練完成后評估網絡時,如何使用.predict_generator函數
如何使用Keras fit和fit_generator
在今天的教程的第一部分中,我們將討論Keras的.fit,.fit_generator和.train_on_batch函數之間的差異。
我將向您展示一個“非標準”圖像數據集的示例,它根本不包含任何實際的PNG,JPEG等圖像!相反,整個圖像數據集由兩個CSV文件表示,一個用于訓練,第二個用于評估。
我們的目標是實現能夠在此CSV圖像數據上訓練網絡的Keras生成器(不用擔心,我將向您展示如何從頭開始實現這樣的生成器功能)。
最后,我們將訓練和評估我們的網絡。
何時使用Keras的fit,fit_generator和train_on_batch函數?
這三個功能基本上可以完成相同的任務,但他們如何去做這件事是非常不同的。
讓我們逐個探索這些函數,查看函數調用的示例,然后討論它們彼此之間的差異。
Keras .fit函數
model.fit(trainX, trainY, batch_size=32, epochs=50)在這里您可以看到我們提供的訓練數據(trainX)和訓練標簽(trainY)。
然后,我們指示Keras允許我們的模型訓練50個epoch,同時batch size為32。
對.fit的調用在這里做出兩個主要假設:
- 我們的整個訓練集可以放入RAM
- 沒有數據增強(即不需要Keras生成器)
相反,我們的網絡將在原始數據上訓練。
原始數據本身將適合內存,我們無需將舊批量數據從RAM中移出并將新批量數據移入RAM。
此外,我們不會使用數據增強動態操縱訓練數據。
Keras fit_generator函數
在深度學習中,我們數據通常會很大,即使在使用GPU的情況下,我們如果一次性將所有數據(如圖像)讀入CPU的內存中,內存很有可能會奔潰。這在實際的項目中很有可能會出現。
對于小型,簡單化的數據集,使用Keras的.fit函數是完全可以接受的。
這些數據集通常不是很具有挑戰性,不需要任何數據增強。
但是,真實世界的數據集很少這么簡單:
- 真實世界的數據集通常太大而無法放入內存中
- 它們也往往具有挑戰性,要求我們執行數據增強以避免過擬合并增加我們的模型的泛化能力
在這些情況下,我們需要利用Keras的.fit_generator函數:
?
函數的參數是:
-
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:最大進程數在使用基于進程的線程時,最多需要啟動的進程數量
- use_multiprocessing:布爾值。當為True時,使用基于基于過程的線程。
-
max_q_size:生成器隊列的最大容量
-
initial_epoch: 從該參數指定的epoch開始訓練,在繼續之前的訓練時有用。
官方demo代碼:
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 filex, y = process_line(line)yield (x, y)f.close()model.fit_generator(generate_arrays_from_file('/my_file.txt'), samples_per_epoch=10000, epochs=10)官方的demo沒有實現batch_size,該demo每次只能提取一個樣本。
針對上述的數據集,實現的batch_size數據提取的迭代器,代碼如下:
def process_line(line):tmp = [int(val) for val in line.strip().split(',')]x = np.array(tmp[:-1])y = np.array(tmp[-1:])return x, ydef generate_arrays_from_file(path, batch_size):while 1:f = open(path)cnt = 0X = []Y = []for line in f:# create Numpy arrays of input data# and labels, from each line in the filex, y = process_line(line)X.append(x)Y.append(y)cnt += 1if cnt == batch_size:cnt = 0yield (np.array(X), np.array(Y))X = []Y = []f.close() model.fit_generator(generate_arrays_from_file('./train', batch_size=batch_size),samples_per_epoch=25024, nb_epoch=nb_epoch, validation_data=(X_test, y_test), max_q_size=1000,verbose=1, nb_worker=1)keras 使用迭代器來實現大數據的訓練, 其簡單的思想就是,使用迭代器從文件中去順序讀取數據。所以自己的訓練數據一定要先隨機打散。因為我們的迭代器也是每次順序讀取一個batch_size的數據進行訓練。
# initialize the number of epochs and batch size EPOCHS = 100 BS = 32# construct the training image generator for data augmentation aug = ImageDataGenerator(rotation_range=20, zoom_range=0.15,width_shift_range=0.2, height_shift_range=0.2, shear_range=0.15,horizontal_flip=True, fill_mode="nearest")# train the network H = model.fit_generator(aug.flow(trainX, trainY, batch_size=BS),validation_data=(testX, testY), steps_per_epoch=len(trainX) // BS,epochs=EPOCHS)我們首先初始化將要訓練的網絡的epoch和batch size。
然后我們初始化aug,這是一個Keras?ImageDataGenerator對象,用于圖像的數據增強,隨機平移,旋轉,調整大小等。
執行數據增強是正則化的一種形式,使我們的模型能夠更好的被泛化。
但是,應用數據增強意味著我們的訓練數據不再是“靜態的” ——數據不斷變化。
根據提供給ImageDataGenerator的參數隨機調整每批新數據。
因此,我們現在需要利用Keras的.fit_generator函數來訓練我們的模型。
顧名思義,.fit_generator函數假定存在一個為其生成數據的基礎函數。
該函數本身是一個Python生成器。
Keras在使用.fit_generator訓練模型時的過程:
- Keras調用提供給.fit_generator的生成器函數(在本例中為aug.flow)
- 生成器函數為.fit_generator函數生成一批大小為BS的數據
- .fit_generator函數接受批量數據,執行反向傳播,并更新模型中的權重
- 重復該過程直到達到期望的epoch數量
您會注意到我們現在需要在調用.fit_generator時提供steps_per_epoch參數(.fit方法沒有這樣的參數)。
為什么我們需要steps_per_epoch?
請記住,Keras數據生成器意味著無限循環,它永遠不會返回或退出。
由于該函數旨在無限循環,因此Keras無法確定一個epoch何時開始的,并且新的epoch何時開始。
因此,我們將訓練數據的總數除以批量大小的結果作為steps_per_epoch的值。一旦Keras到達這一步,它就會知道這是一個新的epoch。
?
?
?
?
參考:? ?
- ?在Keras中導入測試數據的方法
- ?如何使用Keras fit和fit_generator
?
總結
以上是生活随笔為你收集整理的[深度学习] Keras 如何使用fit和fit_generator的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果狂整花活:嘿,Siri,给我做一个
- 下一篇: 宠托师职业受青睐!上门喂宠物 几天收入数