Python 从两个TFR记录中获取所有记录组合

Python 从两个TFR记录中获取所有记录组合,python,tensorflow,tensorflow2.0,Python,Tensorflow,Tensorflow2.0,我有两个TFRecordsA和B,大小不同,包含不同的数据元素 我需要从A和B中获取所有可能的记录对。因此,在训练或测试期间,我希望仅当所有组合都已用尽时,epoch信号才结束,之后,该过程应继续进行下一个epoch 当然,在执行此操作时,我希望指定一个batchsize 我查阅了tf.data.Dataset的文档,没有发现任何类似的内容 当然,如果我要编写python生成器,这是可以实现的。但不幸的是,这没有用处,因为根据文档,python生成器将受到GIL的约束,即全局解释器锁 因此,假设

我有两个TFRecords
A
B
,大小不同,包含不同的数据元素

我需要从
A
B
中获取所有可能的记录对。因此,在训练或测试期间,我希望仅当所有组合都已用尽时,epoch信号才结束,之后,该过程应继续进行下一个epoch

当然,在执行此操作时,我希望指定一个
batchsize

我查阅了
tf.data.Dataset
的文档,没有发现任何类似的内容

当然,如果我要编写python生成器,这是可以实现的。但不幸的是,这没有用处,因为根据文档,python生成器将受到
GIL
的约束,即
全局解释器锁

因此,假设

A
包含
{image1,image2,image3}
,而
B
包含
{im1,im2,im3,im4,im5,im6}
。我已经指定了一个batchsize为
2
。然后,我希望输出如下所示:

(image1,im1)和(image2,im4)

(image3,im2)和(image1,im2)

(image2,im1)和(image2,im3)

…..

15个以上的组合

然后下一个时代开始了


如何在TensorFlow中实现这一点?

有一些关于如何使用or计算两个数组的笛卡尔积的文章

如果您的数组对于内存计算来说是两个大数组,那么最好的选择可能是使用两个
tf.data.Dataset
(对于每个数组为on)并进行双循环:

对于数据集中的数据集\u a:
对于数据集_b.批次(2)中的b:
batch=[[a,b[0]],[a,b[1]]#或类似的东西(它应该有一个TF函数来完成)

使用,在数据集上循环是很快的。

您可以使用
tf.data.Dataset.from_generator
函数,其中generator函数将实现您的逻辑,例如,其他两个数据集的叉积。要从压缩的数据集
db1
db2
中随机抽取一对样本,我独立地洗牌每个数据集不客气

import tensorflow as tf
tf.enable_eager_execution()

A = [1, 2, 3, 4]
B = [5, 6, 7, 8]

db1 = tf.data.Dataset.from_tensor_slices(A).shuffle(len(A)).repeat()
db2 = tf.data.Dataset.from_tensor_slices(B).shuffle(len(B)).repeat()

def cross_db_generator():
    for db1_example, db2_example in zip(db1, db2):
        print(db1_example.numpy(), db2_example.numpy())
        yield db1_example, db2_example


cross_db = tf.data.Dataset.from_generator(cross_db_generator, output_types=(tf.uint8, tf.uint8))
cross_db = cross_db.batch(2)

for sample in cross_db:
    print((sample[0][0].numpy(), sample[1][0].numpy()), (sample[0][1].numpy(), sample[1][1].numpy()))

使用来自\u generator的
将没有效率,因为它受Python的GIL约束。很抱歉,我还没有调查来自\u generator的
的效率。您可能想在上查看此问题:。