keras fit_generator参数steps_per_epoch

时间:2017-08-27 15:34:28

标签: neural-network keras training-data

我想使用keras model.fit_generator方法为我编写自己的生成器,对于方法我需要定义参数" steps_per_epoch"我希望每个时期都使用一次训练数据。

现在我的问题是我在生成器中生成功能我读了wav文件并创建了fft,在我开始训练之前我不知道我有多少批次/样本。在开始使用fit_generator方法之前,我可以计算每个文件的fft,但每次更改数据集(> 20GB)时,我都需要重新计算每个文件的fft并保存每个步骤的步数。有没有更好的方法来定义fit_generator只使用一次每个样本而不计算每个时期的步数?或者我自己的生成器可以通过fit_generator何时开始一个新纪元?

这是我的生成器的代码

def my_generator(filename_list):
    while True:
        for fname in filename_list:
                data, sr = librosa.load(fname)
                fft_result = librosa.core.stft(data)
                batches = features.create_batches(fft_result, batch_size)

                for i in range(len(batches)):
                    yield (batches[i], label)

model.fit_generator(my_generator(filename_list=filename_list, batch_size=batch_size), steps_per_epoch=100, epochs=10)

1 个答案:

答案 0 :(得分:0)

对于列表中的每个文件,您必须计算具有“ n”个批次的fft,其中每个文件的“ n”不同。如果是这样的话:

    Navie方法是循环遍历批处理生成器以计算实际批处理数。此过程只需执行一次。您也可以保存该号码以备将来使用。
  1. 第二种方法是为step_per_epoch分配一个任意数字。该任意数量应大于或等于列表中的文件数量乘以每个fft可以生成的批处理数量。 fft批处理的数量可以是任意数量。这样,如果您在外部“ for”循环完成后对数据进行混洗,那么在经过一段时间后,从统计学角度讲,模型将看到所有训练数据。通过使用early_stop,您可以正确收敛模型,其中“历元”应为非常大的值,例如1000。