Python 在Keras中,如果每个历元的样本数小于';结束';当发电机发生故障时(自身循环),这会对结果产生负面影响吗?

Python 在Keras中,如果每个历元的样本数小于';结束';当发电机发生故障时(自身循环),这会对结果产生负面影响吗?,python,machine-learning,deep-learning,theano,keras,Python,Machine Learning,Deep Learning,Theano,Keras,我用Keras和Theano来训练一个基本的逻辑回归模型 假设我有一个100万条的训练集,它太大了,我的系统无法在不消耗内存的情况下使用标准的model.fit() 我决定使用python生成器函数,并使用model.fit\u generator()来拟合我的模型 我的生成器函数返回1M训练示例的批量大小的块(它们来自一个DB表,所以我一次只提取足够的记录来满足每个批处理请求,同时检查内存使用情况) 这是一个无休止的循环生成器,一旦它达到100万的末尾,它就会在整个场景中循环并继续 fit

我用Keras和Theano来训练一个基本的逻辑回归模型

假设我有一个100万条的训练集,它太大了,我的系统无法在不消耗内存的情况下使用标准的
model.fit()

  • 我决定使用python生成器函数,并使用
    model.fit\u generator()
    来拟合我的模型
  • 我的生成器函数返回1M训练示例的批量大小的块(它们来自一个DB表,所以我一次只提取足够的记录来满足每个批处理请求,同时检查内存使用情况)
  • 这是一个无休止的循环生成器,一旦它达到100万的末尾,它就会在整个场景中循环并继续
fit\u generator()
中有一个强制参数,用于指定每个历元的样本数。文件表明

每个历元的采样数:整数,在进入下一历元之前要处理的采样数

我假设
fit_generator()
不会在每次epoch运行时重置生成器,因此需要一个无限运行的生成器

我通常将
samples\u per\u epoch
设置为生成器循环的训练集的大小

但是,如果
每个历元采样
这小于生成器工作的训练集的大小,并且
nb\u历元
>1:

  • 你会得到奇怪的/不利的/意外的训练结果吗?因为各个时代似乎都有不同的训练范例来适应
  • 如果是这样的话,你是否以某种方式“快进”你的发电机

    • 我现在正在处理一些类似的事情。我想缩短我的时间,这样我就可以记录更多关于损失的信息,或者更频繁地调整我的学习速度

      在不深入研究代码的情况下,我认为
      .fit_generator
      与keras内置
      ImageDataGenerator
      生成的随机增强/无序数据一起工作的事实支持了您的怀疑,即它没有按历元重置生成器。所以我相信你应该很好,只要模型暴露在你的整个训练集中,如果其中一些是在一个单独的时代训练的,那就不重要了


      如果您仍然担心,您可以尝试编写一个生成器,对您的训练集进行随机采样。

      正如您所注意到的,它除了调用生成器外,似乎不会重置或执行任何操作。我想深入探讨的一个论断是,这句话是否有任何利弊:“只要模型暴露于您的整个训练集中,它的一部分是否在单独的时代进行训练就不重要了。”在我看来,改变训练集意味着在不同的时代之间(在GDC中使用)这意味着你正在改变你想要去中心化的参数,所以你不能判断一个新时代是否比前一个时代进步。