簡體   English   中英

在 Keras 中使用 fit_generator

[英]Using fit_generator in Keras

我是在fit_generator中使用fit_generator ,所以我嘗試編寫一個簡單的腳本來幫助我理解它是如何工作的。

X = np.array([[1,2],[10,3],[2,4],[20,5],[30,1],[3,5],[4,6],[7,4],[5,10],[1,7]])
Y = np.array([[2,3],[30,13],[8,6],[100,25],[30,31],[15,8],[24,10],[28,11],[50,15],[7,8]])

def generator(feat,labels):
    i=0
    while (True):
        yield feat[i],labels[i]
        i+=1

model_fnn = tf.keras.models.Sequential()
model_fnn.add(tf.keras.layers.Dense(50, input_dim=X.shape[1], activation=tf.nn.relu))
model_fnn.add(tf.keras.layers.Dense(Y.shape[1], activation=tf.keras.activations.linear))

nb_epoch = 3000

model_fnn.compile(optimizer='adam', loss='mean_squared_error', metrics=['accuracy'])
model_fnn.fit_generator(generator(X,Y), steps_per_epoch=10, epochs=nb_epoch, verbose=0)

但它給了我錯誤:

ValueError: Error when checking input: expected dense_2_input to have shape (2,) but got array with shape (1,)

有人可以幫忙嗎? 謝謝!

這個錯誤似乎是由於您需要將每個輸入/標簽包裝到一個 Numpy 數組中,這將是訓練批次。 此生成器的代碼將是:

def generator(feat,labels):
    i=0
    while (True):
        yield np.array([feat[i]]), np.array([labels[i]])
        i+=1

你的錯誤應該得到解決。 您將使用批量大小 1 進行訓練,因為傳遞給訓練的每個數組將僅包含 1 個對象。

但是,為了使用帶 yield 的生成器進行訓練,您需要確保循環不會崩潰,因為它是一個無限循環並且您沒有無限數據。 這可以使用itertools.cycle來實現:

import itertools

def generator(feat,labels):
    pairs = [(x, y) for x in feat for y in labels]
    cycle_pairs = itertools.cycle(pairs)
    while (True):
        f, p = next(cycle_pairs)
        return np.array([f]), np.array([p])

並且,為了進一步使用使用 yield 的生成器,您可以為函數提供一個參數來指定批量大小(如PyGirl 的評論中所述)。 這應該看起來像這樣:

def generator(feat, labels, batch_size):
    pairs = [(x, y) for x in feat for y in labels]
    cycle_pairs = itertools.cycle(pairs)
    while (True):
        x = []
        y = []
        for _ in range(batch_size):
            f, p = next(cycle_pairs)
            x.append(f)
            y.append(p)
        yield np.array(x), np.array(y)

這意味着,在每一步中,生成器都會生成一個 Numpy 數組,其中包含要訓練的batch_size元素。

為了更多地了解如何在fit_generator中使用fit_generator進行訓練,我還建議閱讀一些關於Keras Sequence Util 的信息,它比使用生成器更安全。

如果這有幫助,請告訴我!

我不確定,但如果您將批量大小添加為 1,則它可以工作,即展開 (2,) -> (1,2)

def generator(feat,labels, batch_size):

  samples_per_epoch = feat.shape[0]
  number_of_batches = samples_per_epoch/batch_size
  counter=0

  while 1:

    X_batch = np.array(feat[batch_size*counter:batch_size*(counter+1)]).astype('float32')
    y_batch = np.array(labels[batch_size*counter:batch_size*(counter+1)]).astype('float32')
    counter += 1
    yield X_batch,y_batch

    #restart counter to yeild data in the next epoch as well
    if counter >= number_of_batches:
        counter = 0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM