Tensorflow 与线程/队列相比,tf.data.Dataset输入管道提供了糟糕的结果

Tensorflow 与线程/队列相比,tf.data.Dataset输入管道提供了糟糕的结果,tensorflow,tensorflow-datasets,Tensorflow,Tensorflow Datasets,早些时候,我使用线程和队列作为数据管道,在两个GPU上都获得了非常高的UTI(数据是动态创建的)。我想使用tf数据集,但我很难重现结果 我尝试了很多方法。因为我是动态创建数据的,所以from_generator()方法看起来很完美。下面看到的代码是我最后一次尝试。虽然我正在使用map()函数处理生成的图像,但在创建数据时似乎存在瓶颈。我在下面的代码中尝试的是,我希望以某种方式“多线程”生成器,以便同时有更多的数据进入。但到目前为止没有更好的结果 def generator(n): wit

早些时候,我使用线程和队列作为数据管道,在两个GPU上都获得了非常高的UTI(数据是动态创建的)。我想使用tf数据集,但我很难重现结果

我尝试了很多方法。因为我是动态创建数据的,所以from_generator()方法看起来很完美。下面看到的代码是我最后一次尝试。虽然我正在使用map()函数处理生成的图像,但在创建数据时似乎存在瓶颈。我在下面的代码中尝试的是,我希望以某种方式“多线程”生成器,以便同时有更多的数据进入。但到目前为止没有更好的结果

def generator(n):
    with tf.device('/cpu:0'):
        while True:
            ...
            yield image, label

def get_generator(n):
    return partial(generator, n)

def dataset(n):
    return tf.data.Dataset.from_generator(get_generator(n), output_types=(tf.float32, tf.float32), output_shapes=(tf.TensorShape([None,None,1]),tf.TensorShape([None,None,1])))

def input_fn():
# ds = tf.data.Dataset.from_generator(generator, output_types=(tf.float32, tf.float32), output_shapes=(tf.TensorShape([None,None,1]),tf.TensorShape([None,None,1])))
    ds = tf.data.Dataset.range(BATCH_SIZE).apply(tf.data.experimental.parallel_interleave(dataset, cycle_length=BATCH_SIZE))
    ds = ds.map(map_func=lambda img, lbl: processImage(img, lbl))
    ds = ds.shuffle(SHUFFLE_SIZE)
    ds = ds.batch(BATCH_SIZE)
    ds = ds.prefetch(1)
return ds

预期的结果将是一个高GPU利用率(>80%),但目前它实际上是低10/20%。

您可以使用
tf.data.Dataset.from\u tensor\u slices
。 只需传递图像/标签路径。该函数接受文件名作为参数

def input_func():
    dataset = tf.data.Dataset.from_tensor_slices(images_path, labels_path)
    dataset = dataset.shuffle().repeat()
    ...
    return dataset 

为什么您需要从_生成器中删除?它有一些局限性,继承自py_func@Sharky,因为我认为,因为我正在动态生成数据,这将是完美的。尽管另一个解决方法是将我从thredas生成的数据放入一个数据集,如果这样做可行的话。因此,我可以使用旧体系结构和数据集API的混合。如果我没有弄错的话,您的数据就是图像。试一下从张量切片开始。@Sharky,但我必须已经生成了我的图像,对吗?不,你可以用随机缓冲区大小来控制它。调用迭代器时将加载图像。此外,您还可以添加预回迁op,并指定并行生产的批次数。看一看。抱歉,我的图像没有路径,因为它们是在培训运行的同时从队列中生成和获取的…@craft您的图像是如何存储的,存储在哪里的?它们只是作为JPG存储,并在培训之前加载到内存中。当培训开始时,我会对它们进行预处理,将它们放入队列中,等等,然后尝试我的建议。根本不需要使用队列。是的,也许你是对的。我明天就去试试。