Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.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
Python 通过交叉乘积将tf.data扩充为两个数据集_Python_Tensorflow_Tfrecord_Data Augmentation - Fatal编程技术网

Python 通过交叉乘积将tf.data扩充为两个数据集

Python 通过交叉乘积将tf.data扩充为两个数据集,python,tensorflow,tfrecord,data-augmentation,Python,Tensorflow,Tfrecord,Data Augmentation,我想为我的输入管道编写一个数据扩充步骤,从概念上讲,我有两个数据集,它们可以成对地馈送到生成器,在那里它们将生成一组输出示例 我通过以下方式实现了这一目标: import tensorflow as tf def gen(a, b): for i in range(2): yield str(a) + " " + str(b) + " " + str(i) a = tf.data.Dataset.range(3) b = tf.data.Dataset.range(3

我想为我的输入管道编写一个数据扩充步骤,从概念上讲,我有两个数据集,它们可以成对地馈送到生成器,在那里它们将生成一组输出示例

我通过以下方式实现了这一目标:

import tensorflow as tf

def gen(a, b):
    for i in range(2):
        yield str(a) + " " + str(b) + " " + str(i)

a = tf.data.Dataset.range(3)
b = tf.data.Dataset.range(3)
dataset = b.interleave(lambda x: a.interleave(lambda y: tf.data.Dataset.from_generator(gen, 
            output_types=(tf.string), 
            args=(x, y)),
            num_parallel_calls = None))

for d in dataset:
    print (d.numpy())
这将产生:

b'0 0 0'
b'0 1 0'
b'0 2 0'
b'0 0 1'
b'0 1 1'
b'0 2 1'
b'1 0 0'
b'1 1 0'
b'1 2 0'
b'1 0 1'
b'1 1 1'
b'1 2 1'
b'2 0 0'
b'2 1 0'
b'2 2 0'
b'2 0 1'
b'2 1 1'
b'2 2 1'
正如所料。我这里的问题是,
gen
是(在我的实际情况中)一个计算开销很大的操作,因此我希望尽可能使用并行调用。到目前为止,我尝试添加num_parallel_调用,但未能提高性能

另外,如果重要的话,我的输入数据集来自
TFRecordDataset
,这为添加
num\u parallel\u调用提供了更多的机会,即

raw_a = tf.data.TFRecordDataset(a_tfrecord_list)
a = raw_dataset.map(some_parsing_function)

如果
gen
是昂贵的部件,则应尽量避免使用
Dataset.from\u generator
<代码>数据集。from_generator
要求为每个元素运行Python生成器,由于Python全局解释器锁,无法并行化

您可以使用
范围
+
映射
而不是从\u生成器重写数据集:

import tensorflow as tf

a = tf.data.Dataset.range(3)
b = tf.data.Dataset.range(3)

def make_dataset(x, y):
  ds = tf.data.Dataset.range(2)
  ds = ds.map(lambda i: tf.strings.as_string(x) + " " + 
              tf.strings.as_string(y) + " " + tf.strings.as_string(i))
  return ds

dataset = b.interleave(lambda x: a.interleave(lambda y: make_dataset(x, y)))

for d in dataset:
    print (d.numpy())

要并行化昂贵的计算,请将
num\u parallel\u calls=tf.data.experional.AUTOTUNE
传递到
map
interleave
方法。

如果
gen
是昂贵的部分,则应尽量避免使用
Dataset.from\u generator
<代码>数据集。from_generator要求为每个元素运行Python生成器,由于Python全局解释器锁,无法并行化

您可以使用
范围
+
映射
而不是从\u生成器重写数据集:

import tensorflow as tf

a = tf.data.Dataset.range(3)
b = tf.data.Dataset.range(3)

def make_dataset(x, y):
  ds = tf.data.Dataset.range(2)
  ds = ds.map(lambda i: tf.strings.as_string(x) + " " + 
              tf.strings.as_string(y) + " " + tf.strings.as_string(i))
  return ds

dataset = b.interleave(lambda x: a.interleave(lambda y: make_dataset(x, y)))

for d in dataset:
    print (d.numpy())

要并行化昂贵的计算,请将
num\u parallel\u calls=tf.data.experional.AUTOTUNE
传递到
map
interleave
方法。

我也有类似的情况,我很难加快管道速度。我在管道中有两个阶段的处理,我使用from_生成器进行每一步的交错处理。但我看不到任何加速。下面是Psuedo代码。有什么想法吗?感谢您的帮助。dataset=tf.data.dataset.from_tensor_切片(_文件列表)dataset=dataset.interleave(lambda x:tf.data.dataset.from_生成器(simple_gen_step1,output_types=(tf.string,tf.float32),args=(x,))dataset=dataset.interleave(lambda x1,y1,z1:tf.data.dataset.from_生成器(简单的第二步,输出类型=(tf.float32,tf.int16),args=(args1,args2,)我有一个类似的情况,我很难加快管道速度。管道中有两个阶段的处理,我使用from_generator进行每一步的交错。但是我没有看到任何速度加快。下面是Psuedo代码。有什么想法吗?感谢任何帮助。dataset=tf.data.dataset。from_tensor_切片(_文件列表)dataset=dataset.interleave(lambda x:tf.data.dataset.from_生成器(简单_-gen_步骤1,输出_类型=(tf.string,tf.float32),args=(x,))dataset=dataset.interleave(lambda x1,y1,z1:tf.data.dataset.from_生成器(简单_-gen_步骤2,输出_类型=(tf.float32,tf.int16),args=(args1,args2,))