歡迎您光臨本站 註冊首頁

淺談keras2 predict和fit

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

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總線之間的數據傳輸次數過多,性能會非常低下。

2、fit_generator

說明: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來成批處理數據。

具體實現如下:

    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)
 



[f2h0b53ohn ] 淺談keras2 predict和fit已經有229次圍觀

http://coctec.com/docs/python/shhow-post-238975.html