Python 如何在两个长度不等的tf.dataset上进行成对迭代?

Python 如何在两个长度不等的tf.dataset上进行成对迭代?,python,tensorflow,iterator,Python,Tensorflow,Iterator,我处理两个长度不等的数据集 我的目标是为datasetA中的每个元素从其他datasetB中获取一个元素。我尝试了.take(1)(如图所示)从datasetB获取单个元素,但重复调用。take(1)不会提前数据集的内部计数,即它总是返回相同的元素;但我每次都想得到一个新元素 我可以使用datasetA:中元素的迭代一个数据集,然后使用其中的第二个数据集作为elementB=iterB.get_next()。当使用iterB时,会引发错误 这是我正在使用的完整玩具代码: datasetA = t

我处理两个长度不等的数据集

我的目标是为datasetA中的每个元素从其他datasetB中获取一个元素。我尝试了
.take(1)
(如图所示)从datasetB获取单个元素,但重复调用
。take(1)
不会提前数据集的内部计数,即它总是返回相同的元素;但我每次都想得到一个新元素

我可以使用datasetA:中元素的
迭代一个数据集,然后使用其中的第二个数据集作为
elementB=iterB.get_next()
。当使用
iterB
时,会引发错误

这是我正在使用的完整玩具代码:

datasetA = tf.data.Dataset.from_tensor_slices([1,  2,  3,  4,  5, 6])
datasetB = tf.data.Dataset.from_tensor_slices([11, 22, 33, 44])

iterB = iter(datasetB)
epochs = 5

for epoch in range(epochs):
  print(f"Epoch {epoch}")
  for element in datasetA:
    print(element)
    elementB = iterB.get_next()
    print(elementB)

我接着说:

for epoch in range(epochs):
  print(f"Epoch {epoch}")
  for element in datasetA:
    print(element)
    elementB = iterB.get_next_as_optional()
    if not elementB.has_value():
      iterB = iter(datasetB)
      elementB = iterB.get_next_as_optional()

    print(elementB.get_value())
这是可行的,但是为
datasetB
重新初始化迭代器很困难

我进一步发现的是,它使用TF操作重新初始化迭代器,迭代器不再可用。 中也提到了这一点,这很有帮助,但并没有让我找到TF2.+解决方案

我要寻找的是一种从
datasetA
datasetB
获取成对元素的优雅方法,其中datasetB在使用时(自动)重复

我不需要迭代组合数据集,除非较短的数据集通过重复“填充”到较长的数据集,然后我可以从datasetA中的a和datasetB中的B采样对(a,B)

TL;博士:
要在两个长度不等的数据集上进行成对迭代,请在使用较短的数据集时重新启动。

我不知道这种编码语言,但下面是您应该做的

datasetA = tf.data.Dataset.from_tensor_slices([1,  2,  3,  4,  5, 6]);
datasetB = tf.data.Dataset.from_tensor_slices([11, 22, 33, 44]);
set i=0,j=0;
get lengths of both alength and blength;
for(i=0;i<alength;i++){
 print(datasetA[i]);
 print(datasetB[j]);
 if(j<blength-1)
   j++;
 else
  j=0;  
 }
datasetA=tf.data.Dataset.from_tensor_切片([1,2,3,4,5,6]);
datasetB=tf.data.Dataset.from_张量_切片([11,22,33,44]);
设定i=0,j=0;
获取alength和blength的长度;

对于(i=0;i我不知道这种编码语言,但这里是您应该做的

datasetA = tf.data.Dataset.from_tensor_slices([1,  2,  3,  4,  5, 6]);
datasetB = tf.data.Dataset.from_tensor_slices([11, 22, 33, 44]);
set i=0,j=0;
get lengths of both alength and blength;
for(i=0;i<alength;i++){
 print(datasetA[i]);
 print(datasetB[j]);
 if(j<blength-1)
   j++;
 else
  j=0;  
 }
datasetA=tf.data.Dataset.from_tensor_切片([1,2,3,4,5,6]);
datasetB=tf.data.Dataset.from_张量_切片([11,22,33,44]);
设定i=0,j=0;
获取alength和blength的长度;

对于(i=0;i要从两个数据集中获取所有可能的样本对,可以使用以下
生成器

    # assuming that dataset_A and dataset_B are defined globally
    def generator():
        for sample_A in dataset_A:
            for sample_B in dataset_B:
                yield (sample_A, sample_B)
要仅获取位于数据集中相同位置(相同索引)的成对样本,有一种标准的
zip
方法:

    dataset = tf.data.Dataset.zip(dataset_A, dataset_B)
当其中一个数据集耗尽时,该生成器停止

如果目标是从
dataset_A
获取所有样本的成对样本,但
dataset_B
较小,则可以无限重复第二个数据集

     dataset_B = dataset_B.repeat()

然后
zip
这两个数据集。

要从两个数据集中获取所有可能的样本对,可以使用以下
生成器

    # assuming that dataset_A and dataset_B are defined globally
    def generator():
        for sample_A in dataset_A:
            for sample_B in dataset_B:
                yield (sample_A, sample_B)
要仅获取位于数据集中相同位置(相同索引)的成对样本,有一种标准的
zip
方法:

    dataset = tf.data.Dataset.zip(dataset_A, dataset_B)
当其中一个数据集耗尽时,该生成器停止

如果目标是从
dataset_A
获取所有样本的成对样本,但
dataset_B
较小,则可以无限重复第二个数据集

     dataset_B = dataset_B.repeat()

然后
zip
这两个数据集。

这是一个方向,但将适用于整个数据集B上的每个datasetA样本。我的目的是同时迭代它们,这样当我从datasetA中获取第二个样本时,我也从datasetB中获取第二个样本。编辑答案以获得所需的数据集。而这s没有完全回答我的问题,这似乎是我目前能得到的最接近的答案了!谢谢!你想在数据集耗尽时“重新启动”
dataset_B
,但并不是使用了
dataset_A
中的所有元素吗?如果这是目标,那么在压缩之前,请调用
dataset_B=dataset_B.repeat()
。这正是我想要的!非常感谢!这是正确的方向,但将适用于整个datasetB中的每个datasetA样本。我的目的是同时迭代它们,以便在从datasetA获取第二个样本时,我也从datasetB获取第二个样本。编辑答案以获得所需的数据设置。虽然这并不能完全回答我的问题,但它似乎是我目前能得到的最接近的!谢谢!当数据集耗尽时,是否要“重新启动”
dataset_B
,但并没有使用
dataset_A
中的所有元素?如果这是目标,则在压缩之前,调用
dataset_B=dataset_B.repeat()
。这正是我要找的!非常感谢!