如何向 tf.data.Dataset 对象添加新的特征列?

M45*_*00R 5 dataset tensorflow tensorflow-datasets

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

  1. 如何将新功能附加到 tf.data.Dataset 对象?
  2. 这个过程应该在迭代之前对整个数据集完成,还是在(我认为在迭代期间可以利用性能提升,但我不知道这个功能是如何工作的)?

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

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

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

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
Run Code Online (Sandbox Code Playgroud)

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

M45*_*00R 10

哇,这真令人尴尬,但我找到了解决方案,而且它的简单性确实让我觉得问这个问题是个白痴。但我会留下答案,以防其他人遇到这个问题。

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

然后通过压缩原始数据集和带有新数据的数据集来创建一个新数据集:

dataset3 = tf.data.Dataset.zip((dataset1, dataset2))
Run Code Online (Sandbox Code Playgroud)