天天看點

keras.utils.Sequence使用注意事項

1)在實作自己的DataLoader過程中一般都是繼承自keras.utils.Sequence,繼承該類必須要實作__len__與__getitem__兩個函數。

2)在調用fit_generator進行訓練時,如果設定了step_per_epoch參數,則每個epoch訓練step_per_epoch個step,每個step有batch_size資料,是以每個epoch共訓練step_per_epoch*batch_size的資料。如果沒有設定step_per_epoch參數,則每個epoch訓練的step個數由__len__決定。

3)在訓練過程中step_per_epoch的個數可以大于 ceil(float(資料集圖檔數量)/batch_size) ,這個數字可以認為是周遊一遍資料集需要的實際step數量,__len__一般也實作為這個數字。在每周遊過一次資料集後(确切的說是調用__len__次),會調用一次on_epoch_end()。

4)__getitem__在調用時會有一個index參數,這個參數的取值範圍就是range(__len__)的結果,index參數的值是在這個範圍内随機給定的。因為__len__實作的時候使用的是ceil向上取整,是以很有可能最後一個index就無法取到一組滿batch資料,因為資料集圖檔數量能夠正好整除batch_size的情況很少。如果沒有取到一組滿batch資料,此時可以傳回None,或者幹脆什麼都不傳回。fit_generator在檢查到是None的時候會再調用__getitem__一次。

5)是以這個地方要特别注意一點,圖檔無論是訓練集還是驗證集的數量一定不能小于batch_size,因為如果圖檔數量小于batch_size,則永遠不能取到一組滿batch,程式就會進入無限循環。另一方面在計算__len__的時候,使用了ceil,那麼__len__至少大于等于1,也不存在不進入__getitem__的情況。除非資料集圖檔數量是0。

繼續閱讀