Python 自定义epoch循环中的Keras回调
我使用keras训练LSTM。输入序列的长度不同。假设序列的长度介于1和Python 自定义epoch循环中的Keras回调,python,tensorflow,keras,Python,Tensorflow,Keras,我使用keras训练LSTM。输入序列的长度不同。假设序列的长度介于1和num_seq之间。因此,我在每个历元中按长度对序列进行分组,以便使用批量大小>1: 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)
num_seq
之间。因此,我在每个历元中按长度对序列进行分组,以便使用批量大小>1:
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)
因为我在历元上使用自定义循环,所以使用历元信息的回调无法正常工作(例如,tensorboard、history等)。解决这个问题的办法是什么?有没有一种方法可以告诉fit函数它目前使用的是哪个历元?在训练期间对训练数据进行操作时,您应该使用
模型。在批上以增量方式进行训练,或者更好的是,使用它可以定义一个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)
这样做的缺点是,您必须自己进行批处理,还必须自己提供验证拆分,您也可以使用生成器进行此操作(因此您可以重用大部分代码)。您是否尝试过fit
方法的initial\u epoch
参数?也许这正是你需要的。我认为如果你想恢复训练,初始历元是有效的。如果你想训练100个历元,在50后停下来,然后继续,那么你应该将初始历元设置为50(或51)。然而,我认为只有在epochs
initial\u epoch
的情况下,这种方法才有效。我想,设置initial\u epoch并不考虑改变学习率。使用model.train\u batch()而不是model.fit
()有什么好处?fit generator方法看起来很有前途。谢谢你的提示!