Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
来自_生成器的Tensorflow数据管道生成数据的速度不够快_Tensorflow_Tensorflow Datasets - Fatal编程技术网

来自_生成器的Tensorflow数据管道生成数据的速度不够快

来自_生成器的Tensorflow数据管道生成数据的速度不够快,tensorflow,tensorflow-datasets,Tensorflow,Tensorflow Datasets,我正在使用tf.data.Dataset构建训练管道,我似乎无法获得速度。我正在管道中使用from_生成器(见下文),我怀疑python全局锁是问题的一部分。我正在努力找出一个设计,可以加快它。我尝试了不同的num_parallel_调用、循环长度、交织中的块长度,但似乎都没有效果。欣赏任何见解 Tensorflow 2.0,默认急切模式。 管道-读取TFR记录并将数据提供给培训 我有两个发电机功能,我正在叠加以分散工作负载 generator_step1-加载tf_记录文件,使用映射解析数据

我正在使用tf.data.Dataset构建训练管道,我似乎无法获得速度。我正在管道中使用from_生成器(见下文),我怀疑python全局锁是问题的一部分。我正在努力找出一个设计,可以加快它。我尝试了不同的num_parallel_调用、循环长度、交织中的块长度,但似乎都没有效果。欣赏任何见解

Tensorflow 2.0,默认急切模式。

管道-读取TFR记录并将数据提供给培训

我有两个发电机功能,我正在叠加以分散工作负载

  • generator_step1-加载tf_记录文件,使用映射解析数据
  • 生成器_步骤2-处理数据并生成批量数据
管道Psuedo代码

dataset = tf.data.Dataset.from_tensor_slices(tf_records_files_list)

dataset = dataset.interleave(lambda x: tf.data.Dataset.from_generator(generator_step1, 
                                output_types=(tf.string, tf.float32), args=(x,batch_size,)),
                                cycle_length=2,
                                block_length=1)

dataset = dataset.interleave(lambda arg1, arg2: tf.data.Dataset.from_generator(generator_step2, 
                                output_types=(tf.float32, tf.int16), args=(arg1, arg2,)),
                                cycle_length=2,
                                block_length=1)

dataset = dataset.prefetch(5)



它运行在功能强大的机器上,我不认为I/O或CPU是瓶颈。有没有关于如何进一步改进或优化的想法?欣赏您的见解。

好的,我认为您的设计不是最优的。首先创建一个
tf.dataset
,然后为每个批创建另一个
tf.dataset
,这会产生大量开销。我建议使用
.map
,而不是
交错
。因此,您必须将生成器重写为一次返回一个样本的函数。之后,您应该通过
tf.data
进行批处理。此外,您应该在映射函数中使用tensorflow函数(例如
tf.image.decode_iamge

dataset = tf.data.Dataset.from_tensor_slices(tf_records_files_list)

dataset = dataset.map(load_func, num_parralel_calls=24)   

dataset = dataset.map(preprocess_func, num_parralel_calls=24)

dataset = dataset.batch(batch_size).prefetch(5)

这应该可以完成任务

如果您有足够的RAM,您可以使用
ds.cache
将数据加载到RAM或缓存到文件中。我有足够的RAM,但几乎不足以缓存所有数据。我有128GB的RAM,数据是数百GB,所以这不是一个选项。我希望管道的设计能有最小的滞后,但我不能让它提供一致的速度。非常感谢。我试试这个。在映射函数中,我需要修剪/处理大型数组以创建批处理。它不是图像数据,而是多维离散数据。一旦我将它们移动到map,我将尝试看看是否有任何tf功能可以利用。如果你有任何建议,请告诉我。感谢您的帮助。请更详细地描述您的数据,并给出一个示例实现。此外,如果对您有帮助,请不要忘记将答案标记为正确。我试图创建一个示例实现,但它变得太复杂了。我遇到的问题是使用map-on函数可以生成多个批。我们的tfrecords中有多个样本,因此在我们的处理函数中,我们根据训练条件创建了一批数据。一个TFRecord文件可以创建多个批,我们使用生成器来实现这一点。但对于map,我们不能使用生成器。你有什么想法吗?TFFile有多个样本(每个样本为2048x100x500)加载\u fn加载TFRecord文件处理\u fn-阵列上的基本操作,创建多个批次