【问题标题】:Is fit_generator in Keras supposed to reset the generator after each epoch?Keras 中的 fit_generator 是否应该在每个时期后重置生成器?
【发布时间】:2018-07-21 14:20:54
【问题描述】:

我正在尝试将fit_generator 与自定义生成器一起使用来读取对内存来说太大的数据。我要训练 125 万行,所以我让生成器一次产生 50,000 行。 fit_generator 有 25 个 steps_per_epoch,我认为每个 epoch 会带来 1.25MM。我添加了一个打印语句,以便我可以看到该过程正在执行多少偏移量,并且我发现它在进入 epoch 2 的几步时超过了最大值。该文件中总共有 175 万条记录,并且有一次它通过了 10 步,在 create_feature_matrix 调用中出现索引错误(因为它没有引入任何行)。

def get_next_data_batch():
    import gc
    nrows = 50000
    skiprows = 0

    while True:
        d = pd.read_csv(file_loc,skiprows=range(1,skiprows),nrows=nrows,index_col=0)
        print(skiprows)
        x,y = create_feature_matrix(d)
        yield x,y
        skiprows = skiprows + nrows
        gc.collect()
get_data = get_next_data_batch()

... set up a Keras NN ...

model.fit_generator(get_next_data_batch(), epochs=100,steps_per_epoch=25,verbose=1,workers=4,callbacks=callbacks_list)

我使用 fit_generator 是错误的,还是需要对我的自定义生成器进行一些更改才能使其正常工作?

【问题讨论】:

    标签: python-3.x machine-learning neural-network keras generator


    【解决方案1】:

    否 - fit_generator 不会重置生成器,它只是继续调用它。为了实现您想要的行为,您可以尝试以下操作:

    def get_next_data_batch(nb_of_calls_before_reset=25):
        import gc
        nrows = 50000
        skiprows = 0
        nb_calls = 0
    
        while True:
            d = pd.read_csv(file_loc,skiprows=range(1,skiprows),nrows=nrows,index_col=0)
            print(skiprows)
            x,y = create_feature_matrix(d)
            yield x,y
            nb_calls += 1
            if nb_calls == nb_of_calls_before_reset:
                skiprows = 0
            else:
                skiprows = skiprows + nrows
            gc.collect()
    

    【讨论】:

    • 发布问题后,我实现了一个与此非常相似的解决方案。感谢您阐明功能。
    猜你喜欢
    • 2017-03-14
    • 1970-01-01
    • 2018-08-19
    • 2019-10-29
    • 1970-01-01
    • 1970-01-01
    • 2018-02-09
    • 2019-12-04
    • 2018-11-23
    相关资源
    最近更新 更多