从两个tf记录中获取所有记录的组合

2024-04-23 18:46:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个TFRecordsAB,大小不同,包含不同的数据元素。你知道吗

我需要从AB中获取所有可能的记录对。因此,在训练或测试期间,我希望epoch的信号只有在所有组合都已用尽时才结束,然后该过程应继续到下一个epoch。你知道吗

当然,在这样做时,我想指定一个batchsize。你知道吗

我浏览了tf.data.Dataset的文档,没有发现这样的东西。你知道吗

当然,如果我要编写python生成器,这是可以完成的。但不幸的是,这是没有用的,因为根据文档,python生成器将被GIL约束,即global interpreter lock。你知道吗

因此,假设

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

(image1, im1) and (image2, im4)

(image3, im2) and (image1, im2)

(image2, im1) and (image2, im3)

..............

15 more combinations

然后下一个时代开始了。你知道吗

如何在TensorFlow中实现这一点?你知道吗


Tags: and数据文档元素记录epochim1image1
2条回答

有一些关于如何使用NumpyTensorflow计算两个数组的笛卡尔积的文章。你知道吗

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

for a in dataset_A:
  for b in dataset_B.batch(2):
     batch = [[a, b[0]], [a, b[1]] # Or something similar (it should have a TF function to do it)

使用^{},在数据集上循环是很快的。你知道吗

您可以使用tf.data.Dataset.from_generator函数,其中生成器函数将实现您的逻辑,例如,其他两个数据集的叉积。为了从压缩的数据集db1db2随机抽取一对样本,我对每个数据集分别进行了洗牌。你知道吗

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

相关问题 更多 >