【问题标题】:Multi-processing with generators reading from multiple files as input for keras生成器从多个文件中读取作为 keras 的输入进行多处理
【发布时间】:2019-01-07 15:35:11
【问题描述】:

我正在使用 keras 训练神经网络,并希望通过多处理加快我的预处理/数据增强。原则上,fit_generator 中的 workers=Nuse_multiprocessing=True 看起来很简单,但在我的情况下,要避免从并行生成器中获取类似数据是很棘手的。

我的数据位于多个文件中,每个文件都有几百万条记录(直到文件末尾才知道总数)。对于每个文件,生成器逐条记录,将记录处理为网络的正确输入/输出格式,并进行一些数据增强。没有唯一的 ID,但我想我可以即时创建一个。

我想知道是否有多个并行生成器最简单,每个生成器处理单独的文件列表。我实际上并没有批量使用所有数据,因此如果一个生成器在其文件列表的开头重新启动,而不是在其他生成器之前重新启动,这并不重要。如果在生成器中我可以访问诸如工人编号(1 到 N)之类的东西,那将很容易做到。

【问题讨论】:

  • 您的数据是TFRecords,还是纯文本文件?
  • 文本。我的生成器进行数据扩充 + 将其编码为 numpy 数组。

标签: python keras multiprocessing generator


【解决方案1】:

我不确定如何实施您的建议。更高级的解决方案是实例化一个tf.data.TextLineDataset,它可以处理多个文本文件。为了训练 Keras 模型,您必须将 iterator 的输出与模型的 Input 张量联系起来。大致如下:

import tensorflow as tf 
# Parsing, augmentation etc
def __parse_record(record):
    ...
    return parsed_record

# Construct a TextLineDataset
ds = tf.data.TextLineDataset(filenames).map(_parse_record)
ds.shuffle().batch(batch_size) # Shuffle and batch

# Turn into an iterator
iterator = tf.data.Iterator.from_structure(ds.output_types, ds.output_shapes)
ds_init = iterator.make_initializer(ds)
# The iterator will yield inputs and labels
x,y = iterator.get_next()

# Tie output of iterator into Input of keras model via the tensor argument
model_input = Input(tensor=x)
# ... model definition

# Upon compiling the model specify target tensors
model.compile(loss, optimizer, target_tensors=[y])

# Now you can use model.fit() instead of fit_generator()
with K.get_session() as sess:
    sess.run(ds_init)
    model.fit(epochs, steps_per_epoch)

这应该训练得很快,但是,它带来了一些缺点。根据相关Keras example

输入张量也有重要的缺点。在 特别是,输入张量在模型构建时是固定的 因为还不支持重新布线网络。 因此,更改数据输入源意味着 必须保存模型权重并重建模型 从头开始连接新的输入数据。 验证目前不能作为训练执行 进度,并且必须在训练完成后执行。

【讨论】:

    猜你喜欢
    • 2019-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-27
    • 2019-12-02
    • 1970-01-01
    • 1970-01-01
    • 2018-07-07
    相关资源
    最近更新 更多