如何将新功能列添加到tf.data.Dataset对象?

时间:2019-08-07 23:41:02

标签: tensorflow dataset tensorflow-datasets

我正在使用Tensorflow 2.0的数据模块并使用tf.data.Dataset对象构建专有数据的输入管道,以存储我的功能。这是我的问题-数据源是一个只有3列的CSV文件,一个标签列,然后是两列,它们仅包含引用存储数据的JSON文件的字符串。我已经开发了访问所需数据的函数,并且能够在列上使用Dataset的map函数来获取数据,但是我看不到如何向tf.data.Dataset对象中添加新列到保存新数据。因此,如果有人可以帮助解决以下问题,那将真的有帮助:

  1. 如何将新功能附加到tf.data.Dataset对象?
  2. 是否应在遍历整个数据集之前或期间对整个数据集执行此过程(我认为在迭代过程中将允许利用性能提升,但我不知道此功能的工作原理)?

我拥有将输入作为列中的元素并执行获取每个元素的功能所需的一切的所有方法,我只是不了解如何将这些数据获取到数据集中。我可以使用Pandas Dataframe作为“中介”或类似的东西来做“ hacky”解决方法,但是我想将所有内容都保留在Tensorflow Dataset和管道过程中,以提高性能并获得更高质量的代码。

我已经浏览了Dataset类(https://www.tensorflow.org/versions/r2.0/api_docs/python/tf/data/Dataset)的Tensorflow 2.0文档,但找不到能够操纵对象结构的方法。

这是我用来加载原始数据集的函数:

def load_dataset(self):
    # TODO: Function to get max number of available CPU threads
    dataset = tf.data.experimental.make_csv_dataset(self.dataset_path,
                                                    self.batch_size,
                                                    label_name='score',
                                                    shuffle_buffer_size=self.get_dataset_size(),
                                                    shuffle_seed=self.seed,
                                                    num_parallel_reads=1)
    return dataset

然后,我有一些方法可以让我接受字符串输入(列元素)并返回实际特征数据。而且我可以使用“ .map”之类的函数从数据集中访问元素。但是,如何将其添加为列?

1 个答案:

答案 0 :(得分:2)

哇,这很令人尴尬,但是我找到了解决方案,它的简单性从字面上让我觉得自己是个白痴。但是,如果其他任何人都面临这个问题,我将保留答案。

您首先使用任何返回数据集的函数(例如“ .map”)创建一个新的tf.data.Dataset对象。

然后,通过压缩原始数据集和包含新数据的数据集来创建新的数据集:

dataset3 = tf.data.Dataset.zip((dataset1, dataset2))