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