【问题标题】:Calling "fit_generator()" multiple times in Keras在 Keras 中多次调用“fit_generator()”
【发布时间】:2019-10-27 15:15:34
【问题描述】:

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

我的数据集被分成 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)

model 是否会在 for 循环的每次迭代中保持学习参数不变并改进它们?

【问题讨论】:

  • 是的,无论当前的权重是多少,两者都将接受训练。在重新编译之前调用keras.backend.clear_session() 会将所有权重清除回初始状态。

标签: python tensorflow keras deep-learning computer-vision


【解决方案1】:

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

还请注意,您尝试做的不是交叉验证,因为要进行真正的交叉验证,您为每一折训练一个模型,并且模型是完全独立的,而不是从前一折的训练继续。

【讨论】:

  • 当你想重置权重时?此外,正如我之前没有读过的:在每一折上都必须训练一个单独的、独立的模型?执行 CV 后,他们将如何融合为一个模型?
【解决方案2】:

据我所知,它将保留以前训练的参数。另外,我认为您可以通过修改 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

【讨论】:

    猜你喜欢
    • 2020-04-25
    • 1970-01-01
    • 1970-01-01
    • 2017-01-08
    • 1970-01-01
    • 2016-12-20
    • 2019-05-18
    • 1970-01-01
    • 2020-03-06
    相关资源
    最近更新 更多