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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章