Tensorflow 在生成分片记录时创建循环分片

Tensorflow 在生成分片记录时创建循环分片,tensorflow,computer-vision,image-segmentation,sharding,tfrecord,Tensorflow,Computer Vision,Image Segmentation,Sharding,Tfrecord,我是tensorflow的新手,我正在tensorflow 1.14中研究图像分割问题。我有一个巨大的数据集,当我试图生成一个大的tfrecord文件时,生成tfrecords的速度非常慢。因此,我想创建TFR记录的“n”个碎片。我找不到在网上做这件事的方法。假设我有600张照片和600个面具。我想生成6个tfrecords片段,每个片段有100个图像和100个面具,以循环方式。我想要的高级/伪代码如下- sharded_tf_record_writer: create n TFRecordWr

我是tensorflow的新手,我正在tensorflow 1.14中研究图像分割问题。我有一个巨大的数据集,当我试图生成一个大的tfrecord文件时,生成tfrecords的速度非常慢。因此,我想创建TFR记录的“n”个碎片。我找不到在网上做这件事的方法。假设我有600张照片和600个面具。我想生成6个tfrecords片段,每个片段有100个图像和100个面具,以循环方式。我想要的高级/伪代码如下-

sharded_tf_record_writer:
create n TFRecordWriter
----> for each_item in n TFRecordWriter
      -----> write_example in round-robin fashion

我在网上搜索了一下,没有找到相关的答案。我不想使用apachebeam进行切分。我非常感谢任何想法/帮助/指导来实现这一点。

我在tensorflow数据集的一期中提出了相同的问题,用户-Conchyliculator回答如下-

写作是由\ TFRecordWriter完成的。TFD将自动计算所需的碎片数量,并在碎片之间分发示例,但每个碎片都是按顺序写入的。 您无法控制碎片的数量,它也会自动计算

然而,示例分布在碎片之间的事实并不能加快编写速度,因为示例没有并行预处理。如果需要并行性,那么必须使用ApacheBeam,它甚至可以扩展到大型数据集

tensorflow/数据集问题的链接为-


这可能会有帮助

我在tensorflow数据集的一期中问了同样的问题,用户Conchyliculator回答如下-

写作是由\ TFRecordWriter完成的。TFD将自动计算所需的碎片数量,并在碎片之间分发示例,但每个碎片都是按顺序写入的。 您无法控制碎片的数量,它也会自动计算

然而,示例分布在碎片之间的事实并不能加快编写速度,因为示例没有并行预处理。如果需要并行性,那么必须使用ApacheBeam,它甚至可以扩展到大型数据集

tensorflow/数据集问题的链接为-


这可能会有帮助

由于您正在tensorflow中处理对象检测,因此官方tensorflow存储库中有一些很好的代码可以满足您的需要。注意:此代码用于Tensorflow2(不确定它是否在TF1中工作)

请参见从coco注释中编写切分TF记录的示例。其思想是在退出堆栈中打开TFRecordWriter的列表(使用
contextlib2.ExitStack()
),当每个线程完成对它的写入时,它将自动关闭TFRecords

实用程序函数创建此TFRecordWriter列表

import contextlib2
import tensorflow as tf
with contextlib2.ExitStack() as tf_record_close_stack, tf.gfile.GFile(
    annotations_file, 'r'
) as fid:
    output_tfrecords = tf_record_creation_util.open_sharded_output_tfrecords(
        tf_record_close_stack, output_path, num_shards
    )
接下来,您可以使用ProcessPoolExecutor以循环方式并行地将tfrecords写入每个碎片(本例中为4个工作进程)

其中,
\u write\u tf\u record
可能如下所示:

def _write_tf_record(image, idx, num_shards, output_tfrecords)
    tf_example = create_tf_example(image)
    shard_idx = idx % num_shards
    output_tfrecords[shard_idx].write(tf_example.SerializeToString())

只需确保您拥有的碎片比多进程工作程序多,否则同一个写入程序可能会被两个不同的进程访问。

由于您正在tensorflow中处理对象检测,官方tensorflow存储库中有一些很好的代码可以满足您的需要。注意:此代码用于Tensorflow2(不确定它是否在TF1中工作)

请参见从coco注释中编写切分TF记录的示例。其思想是在退出堆栈中打开TFRecordWriter的列表(使用
contextlib2.ExitStack()
),当每个线程完成对它的写入时,它将自动关闭TFRecords

实用程序函数创建此TFRecordWriter列表

import contextlib2
import tensorflow as tf
with contextlib2.ExitStack() as tf_record_close_stack, tf.gfile.GFile(
    annotations_file, 'r'
) as fid:
    output_tfrecords = tf_record_creation_util.open_sharded_output_tfrecords(
        tf_record_close_stack, output_path, num_shards
    )
接下来,您可以使用ProcessPoolExecutor以循环方式并行地将tfrecords写入每个碎片(本例中为4个工作进程)

其中,
\u write\u tf\u record
可能如下所示:

def _write_tf_record(image, idx, num_shards, output_tfrecords)
    tf_example = create_tf_example(image)
    shard_idx = idx % num_shards
    output_tfrecords[shard_idx].write(tf_example.SerializeToString())
只需确保您的碎片比多进程工作者多,否则同一个写入程序可能会被两个不同的进程访问