Order of tensorflow.Dataset.concatenate operations

wooyq4lh  于 4个月前  发布在  其他
关注(0)|答案(5)|浏览(37)

问题类型

文档说明请求

你是否在TF nightly版本中复现了这个bug?

来源

二进制文件

Tensorflow版本

2.11.0

自定义代码

OS平台和发行版

Linux Ubuntu 20.04

移动设备

  • 无响应*

Python版本

3.9.7

Bazel版本

  • 无响应*

GCC/编译器版本

9.4.9

CUDA/cuDNN版本

  • 无响应*

GPU型号和内存大小

NVIDIA RTX A4000 15.74GiB

当前行为?

如果我有一个很长的列表,我希望将它们连接起来,那么连接它们的方式很重要,是重左还是重右。我希望在文档中看到这一点,这样其他人就不必自己学习了。(另外,一个静态的tf.Dataset.concatenate_from_list函数,对于用户来说能够正确地执行操作,那就太好了。)具体来说,对于我的大量数据集列表,其中包含大量的图像数据,这些数据是通过py_functions从磁盘读取的,进行了批处理和预取,以下代码片段给出了不同的性能表现。concatenate_by_appending 导致进程被杀死,可能是由于内存不足的条件。相比之下,concatenate_by_prependingconcatenate_by_splitting 运行良好。我怀疑如果我使用了一种更激进的 shuffle 形式,那么只有 concatenate_by_splitting 能够正常工作。
我应该澄清的是,不是创建 concatenate_by_appending 数据集导致进程被杀死。当我尝试使用组合数据集进行 predict 时,进程才会被杀死。对于每个连接操作,前置方法是重左的,最左边的数据集可以立即找到,因为最顶层连接的最左边分支。相反,追加方法对于每个连接操作都是重左的,需要通过所有连接来查找最左边的数据集,并导致进程被杀死,可能是由于资源耗尽,特别是内存不足的情况。至少我认为是这样发生的。

ylamdve6

ylamdve61#

@Leengit

您能否详细说明一下您的功能,并请指定此功能的使用场景?

谢谢!

vltsax25

vltsax252#

我希望tensorflow.Dataset.concatenate的文档页面提到,如果要通过多次使用这个两个数据集concatenate方法来连接多个数据集,那么最安全的方法是用分治法实现,或者至少文档应该表明,逐个附加数据集的简单方法可能会有问题。

另外,我们可以扩展tensorflow.Dataset接口,使得concatenate方法的参数可以是一个数据集列表(或元组等),然后实现将它们用分治法(上面)连接起来(或者使用一个新的tensorflow数据结构)。

在我的情况下,我有一个函数,它读取一个非常大的全息片(医学)图像的一部分。由于这些块需要不同的参数来读取、遮罩、颜色归一化、转换等,所以对我来说,从每个中创建一个单独的tensorflow.Dataset是很方便的。然后我需要将所有这些tensorflow.Dataset对象连接在一起。

lmyy7pcs

lmyy7pcs3#

我认为在https://www.tensorflow.org/guide/data中提及最佳实践以使用数据是更好的地方。在API文档中,我们主要提及其用法和行为。

nx7onnlm

nx7onnlm4#

感谢提出这个问题 @Leengit。我同意应该更新文档,以警告关于将大量数据集连接在一起的性能问题,并建议一个替代方案。
值得注意的是,连接大量数据集的最佳方法是使用 flat_map :

def concat_datasets(datasets):
  ds = tf.data.Dataset.from_tensor_slices(datasets)
  return ds.flat_map(lambda x: x)
sycxhyv7

sycxhyv75#

我不知道可以给List[tf.data.Dataset] 赋值为tf.data.Dataset.from_tensor_slices !请将此方法记录在某处,以便那些想使用成对的concatenate 的人能看到它。

相关问题