如何合并两个(或更多)TensorFlow数据集?

k4emjkb1  于 2023-03-30  发布在  其他
关注(0)|答案(3)|浏览(160)

我已经获取了CelebA数据集,其中包含3个分区,如下所示

>>> celeba_bldr = tfds.builder('celeb_a')
>>> datasets = celeba_bldr.as_dataset()
>>> datasets.keys()
dict_keys(['test', 'train', 'validation'])

ds_train = datasets['train']
ds_test = datasets['test']
ds_valid = datasets['validation']

现在,我想将它们全部合并到一个数据集中。例如,我需要将训练和验证组合在一起,或者可能的话,将它们合并在一起,然后根据我自己的不同主题不相交标准将它们拆分。有办法做到这一点吗?
我在文档https://www.tensorflow.org/versions/r2.0/api_docs/python/tf/data/Dataset中找不到任何选项来执行此操作

iovurdzv

iovurdzv1#

看看你链接的文档,dataset似乎有concatenate方法,所以我假设你可以得到一个联合数据集:

ds_train = datasets['train']
ds_test = datasets['test']
ds_valid = datasets['validation']

ds = ds_train.concatenate(ds_test).concatenate(ds_valid)

参见:https://www.tensorflow.org/versions/r2.0/api_docs/python/tf/data/Dataset#concatenate

lmyy7pcs

lmyy7pcs2#

我还想提一下,如果你需要连接多个数据集(例如,数据集列表),你可以用一种更有效的方式来做:

ds_l = [ds_1, ds_2, ds_3] # list of `Dataset` objects
# 1. create dataset where each element is a `tf.data.Dataset` object
ds = tf.data.Dataset.from_tensor_slices(ds_l)
# 2. extract all elements from datasets and concat them into one dataset
concat_ds = ds.interleave(
    lambda x: x,
    cycle_length=1,
    num_parallel_calls=tf.data.AUTOTUNE,
)

你也可以使用flat_map(),但我认为使用interleave()与并行调用更快。一般来说,interleaveflat_map的推广。

5rgfhyps

5rgfhyps3#

如果数据集来自同一个TFDS数据集,您可以直接使用split API合并它们:

ds = tfds.load('celeb_a', split='train+test+validation')

或者使用特殊的all分割:

ds = tfds.load('celeb_a', split='all')

文件:https://www.tensorflow.org/datasets/splits

相关问题