关于 keras.utils.Sequence 的说明

mrg*_*oom 10 python multithreading multiprocessing deep-learning keras

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

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

Dan*_*ler 14

  1. 任何你想要的,考虑到一个时代会得到 len序列中批次。
  2. 没有秘密,将它用作任何其他生成器,区别在于您可以执行steps_per_epoch=len(generator)steps_per_epoch=None
    • max_queue_size: 任何值,这将加载将在内存中等待的批次,直到轮到它们进入模型
    • workers:任何值,这将是将加载批次的并行“线程”的数量(如果名称不准确,请原谅我)
    • use_multiprocessing: 这个我不知道。对我来说没有必要,我唯一一次尝试它的时候有足够的错误来冻结我的机器
    • shuffle:来自文档:布尔值。是否在每个 epoch 开始时打乱批次顺序。仅与 Sequence (keras.utils.Sequence) 的实例一起使用。当steps_per_epoch 不是None 时无效。
  3. 我觉得这就是。如果你想对模型本身进行线程化,那么你可能想阅读多 GPU 训练,我猜。

Sequence普通发电机相比的优势:

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

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

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

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

fit_generator,将在“模型训练时”加载批次,您可以同时进行两件事。

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