2017-10-04 75 views
2

我是一個有點困惑如何在keras使用fit_generator fit_generator。如何在keras

例如讓說:

  • 我們有10000個數據點
  • 我們要爲10個時代
  • 與512

批量運行使用fit我們只是

  • x, y = load_data() 
    model.fit(x=x, y=y, batch_size=512, epochs=10) 
    

    其中load_data加載所有數據。

    現在該怎麼做同樣的fit_generator

    它,我不清楚它是如何使用fit_generator時處理。如果我有以下發生器:

    def data_generator(): 
        for x, y in load_data_per_line(): 
         yield x, y 
    

    在每次它yields一個數據點上方的發電機。和:

    def data_generator_2(): 
        x_output = [] 
        y_output = [] 
        i = 0 
        for x, y in load_data_per_line(): 
         x_output[i] = x 
         y_output[i] = y 
         i = i + 1 
         if i == batch_size: 
          yield x_output, y_output 
          i = 0 
          x_output = [] 
          y_output = [] 
    

    在上述發電機每次它yields批量大小的數據點(512在這種情況下)。

    爲了達到相同fit但使用fit_generator

    model.fit_generator(data_generator(), steps_per_epoch=10000/512, epochs=10) 
    

    model.fit_generator(data_generator_2(), steps_per_epoch=10000/512, epochs=10) 
    

    或者兩者都是錯誤的(fit_generatordata_generator S)?如果其中任何一個是正確的,那麼是否保證所有數據點都將被處理並且被順序處理?

    任何瞭解是有用

  • 回答

    2

    發生器2幾乎是確定的,但它應更好地返回numpy的數組:

    yield np.asarray(x_output),np.asarray(y_output) 
    

    此外,它應爲無窮大:

    while True: 
    
        #the code inside to loop infinitely 
    

    第一個將不會返回批次,並會失敗。

    你可能會在steps_per_epoch一個問題,因爲10000是不是512的倍數,您需要整數步驟。您可以在發電機內檢查if i == 10000:並通過一個較小的批次作爲最後一批。

    那麼你已經有了(10000 //512) + (10000 % 512)步驟或批次。

    所有批次將按順序讀取,但keras自動洗牌,這些批次的內容,請使用suffle=False。如果你使用多線程(不是這種情況),那麼你需要創建線程安全的生成器或使用keras Sequence

    +0

    只是一個好奇心,所以在這種情況下,最後一批將不會有512的大小,這是好的嗎? – titipata

    +1

    這很好,只要你不讓你的發生器嘗試讀取超過允許的值。 –

    +0

    感謝您的詳細解答。因爲擬合生成器的目的是訓練一個有大量數據的模型,爲什麼它假設我必須知道數據點的數量?如果因爲任何原因我不知道數據點的確切數目會發生什麼?如何設置這種情況下的步驟? –