[英]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.