【问题标题】:Applying Tensorflow Dataset .map() to subsequent dataset elements将 TensorFlow Dataset .map() 应用于后续数据集元素
【发布时间】:2020-11-24 16:52:32
【问题描述】:

我有一个TFRecordDataset,我正在尝试通过map() API 预处理两个后续元素的特征。

dataset_ext = dataset.map(lambda x: tf.py_function(parse_data, [x], [tf.float32]))

由于map 将函数parse_data 应用于每个数据集元素,我不知道parse_data 应该是什么样子才能跟踪从前一个数据集元素中提取的特征。

有人可以帮忙吗?谢谢

编辑:我正在研究 Waymo 数据集,所以每个元素都是一个框架。其结构可以参考https://github.com/Jossome/Waymo-open-dataset-document

这是我的解析函数parse_data

from waymo_open_dataset import dataset_pb2 as open_dataset

def parse_data(input_data):
    frame = open_dataset.Frame()
    frame.ParseFromString(bytearray(input_data.numpy()))   
    av_speed = (frame.images[0].velocity.v_x, frame.images[0].velocity.v_y, frame.images[0].velocity.v_z)
    return av_speed

我想构建一个数据集,其特征是汽车速度和加速度,定义为后续帧之间的速度变化(第一个值可以是 0)。 我想到的一种方法是将map 函数datasetdataset.skip(1) 作为输入,但我还不确定。

【问题讨论】:

    标签: tensorflow parsing dataset


    【解决方案1】:

    我不确定,但可能没有必要将映射函数设为 tf.py_function。 parse_data 应该是什么样子取决于您的数据集 dataset_ext。例如,如果它有两个文件路径(1 个输入数据实例和 1 个输出数据实例),则映射函数应该有 2 个参数并且应该返回 2 个参数。

    例如:如果您的数据集包含图像,并且您希望在每次绘制数据集示例时随机裁剪它们,则映射函数如下所示:

    def process_img_random_crop(img_in, img_out, output_shape):
        merged = tf.stack([img_in, img_out])
        mergedCrop = tf.image.random_crop(merged, size=(2,) + output_shape)
        img_in_cropped, img_out_cropped = tf.unstack(mergedCrop, 2, 0)
        return img_in_cropped, img_out_cropped
    

    我这样称呼它:

    image_ds_test = image_ds_test.map(lambda i, o: process_img_random_crop(i, o, output_shape=(64, 64, 1)), num_parallel_calls=tf.data.experimental.AUTOTUNE)
    

    您对dataset_ext 的具体计划是什么?其中包含什么?

    编辑: 好的,明白了你对这两个框架的意思。因此 map 函数分别应用于数据集的每个条目。如果您需要交叉条目信息,则数据集的单个条目需要包含两个框架。有了这个更复杂的设置,我建议你使用 tensorflow Sequence:来自 tensorflow 团队的 The explanation 非常直接。希望对您有所帮助!

    【讨论】:

    • 我已经编辑了我的问题,包括更多细节。我相信我可以接受您的建议,并将原始数据集和通过跳过第一个元素获得的数据集提供给 map。但是,我仍然对正确的解析函数摸不着头脑。
    • 谢谢,我看过了。一个 tf Sequence 似乎绝对是要走的路。我现在关心的是如何从TFRecordDataset 构建它。我可能刚刚改变了我最初的问题,但没有解决它。
    • 是的,我一直都有这种感觉 :D 你成功了吗?
    • 不是真的,我使用了一些解决方法。我从我的数据集中解析了速度特征,并构建了一个包含速度和加速度的新 TFRecordDataset。然后我只写了一个管道,它同时从原始数据集和新数据集解析数据。这不是最优雅的解决方案,但至少它有效;)
    猜你喜欢
    • 2018-08-22
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    • 2020-10-06
    • 2016-09-16
    • 1970-01-01
    • 2018-04-14
    • 2018-07-06
    相关资源
    最近更新 更多