tensorflow 如何从不规则Tensor中减去一个Tensor?

fzsnzjdm  于 2023-03-13  发布在  其他
关注(0)|答案(1)|浏览(185)

我提出的问题与TensorFlow broadcasting of RaggedTensor非常相似
基本上,我在做机器学习,一个数据样本由一系列坐标列表组成,其中每个坐标列表代表画布上的一个绘图笔划。一个这样的样本可能是,

[
[[2,3], [2,4], [3,6], [4,8]], 
[[7,3], [10,9]], 
[[10,12], [14,17], [13,15]]
]

我想通过减去平均值并除以标准差来归一化这些坐标。具体来说,我想分别找到所有x坐标(index=0)和y坐标(index=1)的平均值和标准差。

list_points=tf.ragged.constant(list_points)
STD=tf.math.reduce_std(list_points, axis=(0,1))
mean=tf.reduce_mean(list_points, axis=(0,1))

标准差和平均值的形状均为(2,)
现在,我想从list_points(这是坐标列表的示例列表)中减去均值,但似乎对于ragged_rank=3,我只能减去覆盖每个数据点的标量或Tensor。有没有简单的方法可以简单地将RaggedTensor减去shape(2,)的Tensor?
我试过直接从list_points中减去mean,但是无论我做什么,我都会得到这个错误:
ValueError:pylist的标量值深度为3,但ragged_rank=3要求标量值深度大于3

7lrncoxx

7lrncoxx1#

在您的例子中,ragged_rank实际上是1。因此tf.reduce_mean可以按如下方式使用

list_points = tf.ragged.constant(
    [
        [[2,3], [2,4], [3,6], [4,8]], 
        [[7,3], [10,9]], 
        [[10,12], [14,17], [13,15]]
    ],
    ragged_rank=1
)
list_points.shape
# TensorShape([3, None, 2])

tf.reduce_mean(list_points, axis=[0, 1])
# tf.Tensor: shape=(2,), dtype=float64, numpy=array([7.22222222, 8.55555556])>

tf.reduce_mean(list_points**2, axis=[0, 1]) - tf.reduce_mean(list_points, axis=[0, 1])**2
# <tf.Tensor: shape=(2,), dtype=float64, numpy=array([19.72839506, 23.80246914])>

对于ragged_rank=2情况,我们可以吸引更棘手的tf.math.segment_mean

相关问题