如何按参与者/手势等属性拆分tf.data.DataSet且无需拆分单个tf_record?
你遇到的报错是因为tf.data.Dataset的filter接口默认在图模式下执行,Python原生的any()会尝试将TensorFlow布尔张量转为Python原生布尔值,触发图模式语法限制,即使加@tf.function也无法兼容Python原生逻辑。你可以用TensorFlow原生的张量运算实现同等逻辑,同时保持写法简洁:
可复用封装实现
先封装通用的属性匹配工具函数:
import tensorflow as tf def filter_by_attr_in(attr_name: str, match_values: list): # 提前将匹配列表转为tf常量,适配图模式 match_tensor = tf.constant(match_values) def _filter_fn(feature_dict): # 广播比较当前属性值和所有匹配值,任意匹配则返回True return tf.math.reduce_any(feature_dict[attr_name] == match_tensor) return _filter_fn
调用方式(和你预期的简洁写法一致)
# 筛选participant为1或2的样本 subset = ds.filter(filter_by_attr_in("participant", [1, 2])) # 筛选gesture为5、6、7的样本同理 subset = ds.filter(filter_by_attr_in("gesture", [5, 6, 7]))
多条件组合写法
如果需要同时匹配多个属性,直接组合逻辑运算符即可:
# 筛选participant为1/2,且gesture为3/4的样本 subset = ds.filter( lambda x: filter_by_attr_in("participant", [1,2])(x) & filter_by_attr_in("gesture", [3,4])(x) )
该实现完全适配图模式执行,性能和你原来的链式or写法一致,不需要修改底层TFDS配置和tf_record存储结构,新增参与者/手势时只需要修改匹配列表即可。
内容的提问来源于stack exchange,提问作者Ian Zurutuza
相关产品推荐
相关产品推荐

