关于keras.utils.Sequence的澄清

时间:2018-12-04 19:32:00

标签: python multithreading keras deep-learning multiprocessing

Keras几乎没有关于keras.utils.Sequence的信息,实际上我想从keras.utils.Sequence派生我的批处理生成器的唯一原因是我不想自己写带有队列的线程池,但是我我不确定这是否是完成任务的最佳选择,这是我的问题:

  1. 如果我有随机数生成器但没有生成器,__len__应该返回什么 带有样本的任何预定义“列表”。
  2. 如何keras.utils.Sequence     应该与fit_generator一起使用,我对此感兴趣     max_queue_sizeworkersuse_multiprocessingshuffle     参数。
  3. 喀拉拉邦还有哪些其他选择?

1 个答案:

答案 0 :(得分:2)

  1. 任何您想做的,考虑到一个纪元将从Sequence中获得len个批处理。
  2. 没有秘密,可以将其用作任何其他生成器,不同之处在于可以执行steps_per_epoch=len(generator)steps_per_epoch=None
    • max_queue_size:任何值,它将加载在内存中等待直到轮到模型的批次
    • workers:任何值,它将是将要批量加载的并行“线程”数(如果名称不正确,请原谅)
    • use_multiprocessing:我不知道这个。对我而言,这不是必须的,而且我唯一的尝试是它的越野车足以冻结我的机器
    • shuffle:来自the documentation:布尔值。是否在每个纪元开始时对批次顺序进行洗牌。仅用于Sequence实例(keras.utils.Sequence)。当steps_per_epoch不为None时无效。
  3. 我想就是这样。我想,如果您想对模型本身进行线程化,那么您可能想阅读有关多GPU训练的信息。

Sequence在常规生成器上的优势:

使用序列,可以跟踪已获取的批次,将哪些批次发送到哪个线程进行加载,并且永远不会发生冲突,因为它基于索引。

使用生成器,并行处理将无法跟踪已经采摘了哪些批次,因为线程之间不会互相交谈,除了顺次逐批生产之外,没有其他选择。

生成器和序列在循环中的优势

在一个循环中,您将“等待批处理加载”,“等待模型培训”,“等待批处理加载”,“等待模型培训”。

使用fit_generator,将在模型训练期间“批量”加载批处理,同时使这两种情况同时发生。

对于非常简单的生成器,不会有太大影响。对于复杂的发电机,增强器,大图像加载器等,生成时间非常重要,并且可能严重影响您的速度。