如何从RaggedTensor中减去形状为(2,)的Tensor?
解决RaggedTensor与形状(2,)张量的广播运算问题
你的场景是用RaggedTensor存储绘画笔触点数据,需要对所有x/y坐标分别做归一化,但直接和shape(2,)的均值、标准差做减法时触发维度不匹配错误,这是因为RaggedTensor的广播规则要求张量维度能和其层级结构对齐。
这里有两种简便的解决方法:
方法1:扩展均值/标准差的维度以匹配广播规则
因为你的RaggedTensor最后一维是固定长度2(对应x/y坐标),而均值mean和标准差STD的形状是(2,),只需要给它们扩展两个前置维度(对应笔画数、点数的可变维度),就能和RaggedTensor完成广播运算:
# 扩展维度,将(2,)转为(1,1,2) mean_expanded = tf.expand_dims(mean, axis=[0, 1]) std_expanded = tf.expand_dims(STD, axis=[0, 1]) # 执行归一化 normalized_points = (list_points - mean_expanded) / std_expanded
方法2:用tf.ragged.map_flat_values遍历运算
利用map_flat_values方法直接对RaggedTensor最内层的每个坐标点做运算,这个方法会自动处理层级结构,无需手动调整维度:
normalized_points = tf.ragged.map_flat_values(lambda point: (point - mean) / STD, list_points)
两种方法都能完成归一化,测试时可以用你提供的示例数据验证:输入的RaggedTensor经过运算后,每个点的x坐标会减去所有x的均值、除以x的标准差,y坐标同理。
内容的提问来源于stack exchange,提问作者Aiden Yun
相关产品推荐
相关产品推荐

