2017-01-26 200 views
3

好像我能得到通過使num_samples做大保持nb_epoch = 1完全相同的結果。我認爲多個曆元的目的是相同的數據多次迭代,但Keras並不在每個曆元的末尾重新實例化發生器。它只是繼續前進。例如培訓本的自動編碼:什麼nb_epoch的Keras的fit_generator的目的是什麼?

import numpy as np 
from keras.layers import (Convolution2D, MaxPooling2D, 
    UpSampling2D, Activation) 
from keras.models import Sequential 

rand_imgs = [np.random.rand(1, 100, 100, 3) for _ in range(1000)] 

def keras_generator(): 
    i = 0 
    while True: 
     print(i) 
     rand_img = rand_imgs[i] 
     i += 1 
     yield (rand_img, rand_img) 


layers = ([ 
    Convolution2D(20, 5, 5, border_mode='same', 
     input_shape=(100, 100, 3), activation='relu'), 

    MaxPooling2D((2, 2), border_mode='same'), 

    Convolution2D(3, 5, 5, border_mode='same', activation='relu'), 

    UpSampling2D((2, 2)), 

    Convolution2D(3, 5, 5, border_mode='same', activation='relu')]) 

autoencoder = Sequential() 
for layer in layers: 
    autoencoder.add(layer) 

gen = keras_generator() 
autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy') 
history = autoencoder.fit_generator(gen, samples_per_epoch=100, nb_epoch=2) 

好像我得到同樣的結果(samples_per_epoch = 100,nb_epoch = 2),I代表做(samples_per_epoch = 200,nb_epoch = 1)。我是否按照預期使用fit_generator?

回答

3

是 - 你是正確的,使用時keras.fit_generator這兩種方法是等效的。但是 - 有各種各樣的原因,保持epochs是合理的:

  1. 記錄:在這種情況下epoch包括以後要記錄一些重要的統計信息有關的培訓(如例如時間或損失的數據量時代的結束)。
  2. 保持目錄結構當您正在使用發電機來從硬盤加載數據 - 在這種情況下 - 當你知道你有多少個文件在你的目錄 - 你可以調整batch_sizenb_epoch這些值那個時代會包括遍歷數據集中的每個示例。
  3. 使用flow發生器時保持數據的結構 - 在這種情況下,當你有例如一組圖片加載到您的Python並要使用Keras.ImageDataGenerator將不同類型的數據轉換的,以這樣的方式設置batch_sizenb_epoch那個時代包括要通過數據集中的每一個例子可以幫助您保持的進度跟蹤你培訓過程。