2017-05-04 23 views
1

我使用keras來訓練LSTM。輸入序列長度不同。可以說序列的長度在1到num_seq之間。因此,爲了使用一個批量大小I組序列通過在每個曆元長度> 1:自定義時代循環中的Keras回調

for epoch in xrange(nb_epochs): 
for i in range(1,num_seq): 
    X,y = get_sequences(length=i) 
    model.fit(X,y,batch_size=100,epochs=1, validation_split=0.1, callbacks=None) 

因爲我使用自定義的環在曆元,其使用所述曆元信息不能正常工作的回調(例如張量板,歷史等)。什麼是解決這個問題的方法?有沒有一種方法可以說明適合功能,它現在的時代呢?

+0

您是否嘗試過'fit'方法的'initial_epoch'參數?也許它會滿足你的需求。 –

+0

如果你想恢復訓練,我認爲initial_epoch可以工作。如果你想訓練100個紀元,在50之後停止,然後想繼續,那麼你會想將initial_epoch設置爲50(或51)。不過,我認爲這隻適用於'epochs'>'initial_epoch' – Merlin1896

+0

此外,設置initial_epoch並沒有考慮到更改學習率,我猜。 – Merlin1896

回答

2

在訓練,你應該逐步使用model.train_on_batch或在做對你的訓練數據操作 - 更好的 - 使用fit_generator它可以讓你定義一個python發生器,可產生(x,y)元組每個批次。然後,這也照顧到了回調的正確調用。

例如:

def train_gen(): 
    while True: 
     for i in range(1,num_seq): 
      X,y = get_sequences(length=i) 
      yield X, y 
model.fit_generator(train_gen, steps_per_epoch=num_seq) 

這種方法的缺點是,你必須自己做配料,也必須提供驗證分裂自己,你可以用一臺發電機做的一樣好(因此你可以重用大部分代碼)。

+0

使用'model.train_on_batch()'而不是'model.fit'(),有什麼好處?擬合生成器方法看起來真的很平穩。感謝提示! – Merlin1896