在Keras中多次调用"fit_generator()"函数

4

我有一个生成器函数,用它可以生成元组(输入、目标),用 fit_generator() 方法在 Keras 中训练我的模型。

我的数据集分为 9 个相等的部分。我希望使用 fit_generator() 方法对数据集进行留一交叉验证,并保持之前训练学习到的参数。

我的问题是,对模型多次调用 fit_generator() 方法会使它从头开始重新学习之前的训练和验证集合上的学习参数,还是保持这些已学习的参数从而提高准确性?

经过一番搜索,我发现在 Keras 中,fit() 方法会保留已学习的参数,例如在 Calling "fit" multiple times in Keras 上。但我不确定对于 fit_generator() 是否也是如此,如果是的话,是否可以用于数据的交叉验证。

我考虑实现交叉验证的伪代码如下:

class DatasetGenerator(Sequence):
    def __init__(validation_id, mode):
        #Some code

    def __getitem__():
        #The generator function

        #Some code

        return (inputs, targets)

for id in range(9):

    train_set = DatasetGenerator(id, 'train') 
    #train_set contains all 8 parts leaving the id part out for validation.

    validation_set = DatasetGenerator(id, 'val')
    #val_set contains the id part.

    history = model.fit_generator(train_set, epochs = 10, steps_per_epoch = 24000, validation_data = val_set, validation_steps = 3000)

print('History Dict:', history.history)
results = model.evaluate_generator(test_set, steps=steps)
print('Test loss, acc:', results)

for循环的每次迭代中,model是否会保持已学习参数的完整性并进一步改善它们?


1
是的,无论哪个都会从当前权重中获取训练。在重新编译之前调用 keras.backend.clear_session() 将清除所有权重并将其恢复到初始状态。 - TheLoneDeranger
2个回答

4

fitfit_generator 在这方面的行为相同,再次调用它们将从之前训练的权重恢复训练。

另外请注意,你所尝试的不是交叉验证,因为要进行真正的交叉验证,你需要为每个折训练一个模型,这些模型完全独立,不会继续自前一折的训练。


当您想要重置权重时怎么办? 此外,由于我之前没有阅读过:每次折叠都必须训练一个单独的、独立的模型?在执行CV后它们将如何融合成一个模型? - Ben

1
据我所知,它将保留先前训练的参数。此外,我认为您尝试进行的操作可以通过修改Sequence的on_epoch_end()方法来完成。可能是这样的:
class DatasetGenerator(Sequence):
    def __init__(self, id, mode):
        self.id = id
        self.mode = mode
        self.current_epoch=0
        #some code

    def __getitem__(self, idx):
        id = self.id
        #Some code
        return (inputs, targets)

    def on_epoch_end():
        self.current_epoch += 1
        if self.current_epoch % 10 == 0:
            self.id += 1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接