1、使用predict時,必須設置batch_size,否則效率奇低。
查看keras文檔中,predict函數原型:
predict(self, x, batch_size=32, verbose=0)
說明:
只使用batch_size=32,也就是說每次將batch_size=32的數據通過PCI總線傳到GPU,然后進行預測。在一些問題中,batch_size=32明顯是非常小的。而通過PCI傳數據是非常耗時的。
所以,使用的時候會發現預測數據時效率奇低,其原因就是batch_size太小了。
經驗:
使用predict時,必須人為設置好batch_size,否則PCI總線之間的數據傳輸次數過多,性能會非常低下。
說明:keras 中 fit_generator參數steps_per_epoch已經改變含義了,目前的含義是一個epoch分成多少個batch_size。舊版的含義是一個epoch的樣本數目。
如果說訓練樣本樹N=1000,steps_per_epoch = 10,那么相當于一個batch_size=100,如果還是按照舊版來設置,那么相當于
batch_size = 1,會性能非常低。
經驗:
必須明確fit_generator參數steps_per_epoch
補充知識:Keras:創建自己的generator(適用于model.fit_generator),解決內存問題
為什么要使用model.fit_generator?
在現實的機器學習中,訓練一個model往往需要數量巨大的數據,如果使用fit進行數據訓練,很有可能導致內存不夠,無法進行訓練。
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)
其中各項的具體解釋,請參考Keras中文文檔
我們重點關注的是generator參數:
generator: 一個生成器,或者一個 Sequence (keras.utils.Sequence) 對象的實例, 以在使用多進程時避免數據的重復。 生成器的輸出應該為以下之一:
一個 (inputs, targets) 元組
一個 (inputs, targets, sample_weights) 元組。
那么,問題來了,如何構建這個generator呢?有以下幾種辦法:
自己創建一個generator生成器
自己定義一個 Sequence (keras.utils.Sequence) 對象
使用Keras自帶的ImageDataGenerator和.flow/.flow_from_dataframe/.flow_from_directory來生成一個generator
1.自己創建一個generator生成器
使用Keras自帶的ImageDataGenerator和.flow/.flow_from_dataframe/.flow_from_directory 靈活度不高,只有當數據集滿足一定格式(例如,按照分類文件夾存放)或者具備一定條件時,使用才使用才較為方便。
此時,自己創建一個generator就很重要了,關于python的generator是什么原理,怎么使用,就不加贅述,可以查看python的基本語法。
此處,我們用yield來返回數據組,標簽組,從而使fit_generator可以調用我們的generator來成批處理數據。
具體實現如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
def myGenerator(batch_size): # loading data X_train,Y_train = load_data(...) # data processing # ................ total_size = X_train.size #batch_size means how many data you want to train one step while 1 : for i in range (total_size / / batch_size): yield x_train[i * batch_size:(i + 1 ) * batch_size], y[i * batch_size:(i + 1 ) * batch_size] return myGenerator |
接著你可以調用該生成器:
self._model.fit_generator(myGenerator(batch_size),steps_per_epoch=total_size//batch_size, epochs=epoch_num)
以上這篇淺談keras2 predict和fit_generator的坑就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。
原文鏈接:https://blog.csdn.net/lujiandong1/article/details/73556163