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



我使用两个长度不等的数据集。

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

我可以使用for element in 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的迭代器很麻烦。

我进一步发现,对于旧的TensorFlow,它使用TF操作来重新初始化迭代器,而迭代器已不可用。这个问题中也提到了这一点,这很有帮助,但并没有让我找到TF2++解决方案。

我正在寻找一种从datasetAdatasetB中获得成对元素的优雅方法,其中数据集B在被消耗时(自动(重复。

我不需要的是在组合的数据集上迭代,除非较短的数据集得到"0";填充";通过重复,我可以对数据集A中的A和数据集B中的B的对(A,B(进行采样。

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

要从两个数据集获得所有可能的样本对,可以使用以下generator:

# 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()

然后CCD_ 13这两个数据集。

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

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;  
}

最新更新