我有一个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
函数dataset
和dataset.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团队的解释非常直接。希望得到帮助!