【问题标题】:Clarification about keras.utils.Sequence关于 keras.utils.Sequence 的说明
【发布时间】:2019-05-06 07:20:39
【问题描述】:

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

  1. 如果我有随机发生器但我没有,__len__ 应该返回什么 有任何带有样本的预定义“列表”。
  2. 如何keras.utils.Sequence 应该和fit_generator一起使用,我有兴趣 max_queue_size,workers,use_multiprocessing,shuffle 主要是参数。
  3. keras 中还有哪些其他可用选项?

【问题讨论】:

    标签: python multithreading keras deep-learning multiprocessing


    【解决方案1】:
    1. 任何你想要的,考虑到一个时期将从序列中获得len 批次。
    2. 没有什么秘密,把它当作任何其他生成器使用,不同之处在于你可以使用steps_per_epoch=len(generator) 或steps_per_epoch=None。
      • max_queue_size:任何值,这将加载将在内存中等待直到轮到它们进入模型的批次
      • workers: 任何值,这将是加载批次的并行“线程”数(如果名称不准确,请原谅)
      • use_multiprocessing:这个我不认识。对我来说这不是必需的,我唯一一次尝试它的时候就足以让我的机器死机了
      • shuffle:来自the documentation:布尔值。是否在每个 epoch 开始时打乱批次的顺序。仅用于 Sequence (keras.utils.Sequence) 的实例。当 steps_per_epoch 不是 None 时无效。
    3. 我想就是这样。如果您想对模型本身进行线程化,那么您可能想阅读有关多 GPU 训练的信息,我猜。

    Sequence 相对于常规生成器的优势:

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

    使用生成器,并行处理将无法跟踪哪些批次已被采用,因为线程之间不相互通信,并且除了按顺序逐批次产生之外别无选择。

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

    在一个循环中,您将“等待批量加载”、“等待模型训练”、“等待批量加载”、“等待模型训练”。

    使用fit_generator,将在模型训练“同时”加载批次,这两种情况会同时发生。

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

    【讨论】:

    • 关于1. :即如果我在keras.utils.Sequence 中有随机生成器,我可以从__len__ 返回任何数字,例如100000,只要我将steps_per_epoch 设置为正确值?
    • 关于2. :据我所知shuffle 在随机生成器的情况下是无用的,但假设我在keras.utils.Sequence 中有一些固定的样本列表,我应该在其中实现一些随机列表排列机制派生自keras.utils.Sequence 的类,或者它会在其他代码的某个地方被打乱?
    • 关于3.:我的意思是keras.utils.Sequence的目的是什么?为什么我更喜欢在while 循环中手动实现yeld 批处理的简单批处理生成器?我可以从中派生出像keras.utils.Sequence 这样的其他类吗?
    • 查看更新的答案。我认为没有其他课程。
    • 1 - 是的。 /// 2 - Keras 将打乱“批次索引”,哪个批次先出现。如果您想在产生批次之前打乱您的列表,您可以在序列内的on_epoch_end 方法中进行打乱。
    猜你喜欢
    • 2019-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-20
    • 1970-01-01
    相关资源
    最近更新 更多