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