将Tensorflow Dataset.map()应用于后续的数据集元素



我有一个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)作为输入,但我还不确定。

我不确定,但可能没有必要将映射函数设置为tf.py_function。parse_data的外观取决于数据集dataset_ext。例如,如果它有两个文件路径(一个输入数据实例和一个输出数据实例(,那么映射函数应该有两个参数,并且应该返回两个参数。

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

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函数被分别应用于数据集的每个条目。如果需要交叉条目信息,数据集的单个条目需要包含两个帧。对于这种更复杂的设置,我建议您使用tensorflowSequence:tensorflow团队的解释非常直接。希望得到帮助!

相关内容

  • 没有找到相关文章

最新更新