如何对两个不等长tf.datasets进行成对迭代?
How to do a pairwise iteration over two unequal-length tf.datasets?
我使用两个长度不等的数据集。
我的目标是从另一个数据集 B 中为数据集 A 中的每个元素获取一个元素。我尝试 .take(1)
(如图 )从数据集 B 中获取单个元素,但重复调用 .take(1)
不会增加数据集的内部计数,即它总是 returns 相同的元素;但我每次都想得到一个新元素。
我可以使用 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
重新初始化迭代器很麻烦。
我进一步发现的是这个,它使用了一个TF操作来重新初始化迭代器,它不再可用。
中也提到了这一点,这很有帮助,但没有引导我找到 TF2.+ 解决方案。
我正在寻找的是一种从 datasetA
和 datasetB
获取成对元素的优雅方法,其中 datasetB 在使用时(自动)重复。
我不需要迭代组合数据集,除非较短的数据集通过重复“填充”到较长的数据集,然后我可以从数据集 A 中对 (A, B) 和 A 进行采样B 来自数据集 B.
长话短说:
想要对两个不等长的数据集进行成对迭代,在使用时重新启动较短的数据集。
我不知道这种编码语言,但这是你应该做的。
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;
}
要从两个数据集中获取所有可能的样本对,可以使用以下 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()
然后zip
两个数据集。
我使用两个长度不等的数据集。
我的目标是从另一个数据集 B 中为数据集 A 中的每个元素获取一个元素。我尝试 .take(1)
(如图 .take(1)
不会增加数据集的内部计数,即它总是 returns 相同的元素;但我每次都想得到一个新元素。
我可以使用 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
重新初始化迭代器很麻烦。
我进一步发现的是这个
我正在寻找的是一种从 datasetA
和 datasetB
获取成对元素的优雅方法,其中 datasetB 在使用时(自动)重复。
我不需要迭代组合数据集,除非较短的数据集通过重复“填充”到较长的数据集,然后我可以从数据集 A 中对 (A, B) 和 A 进行采样B 来自数据集 B.
长话短说: 想要对两个不等长的数据集进行成对迭代,在使用时重新启动较短的数据集。
我不知道这种编码语言,但这是你应该做的。
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;
}
要从两个数据集中获取所有可能的样本对,可以使用以下 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()
然后zip
两个数据集。