我有一个张量,我想根据它的分段来计算中值。使用tf.math.segment_max/sum/mean可以很容易地进行分段最大值、求和值、平均值等操作,但如果我想要分段中值,该如何操作?
x = tf.constant([[0.1, 0.2, 0.4, 0.5],
[0.1, 0.8, 0.2, 0.6],
[0.1, 0.2, 0.4, 0.5],
[0.3, 0.1, 0.2, 0.9],
[0.1, 0.1, 0.6, 0.5]])
result = tf.math.segment_max(x, tf.constant([0, 1, 1, 1, 2]))
result
tf.constant([[0.1, 0.2, 0.4, 0.5],
[0.1, 0.2, 0.2, 0.6],
[0.1, 0.1, 0.6, 0.5]])
可以通过使用segment_ids
将张量转换为具有tf.RaggedTensor.from_value_rowids
的粗糙张量来实现。然后沿每个轴应用CCD_ 3。
例如,为了获得上面例子的粗糙张量:
a = tf.RaggedTensor.from_value_rowids(
values=x,
value_rowids=[0, 1, 1, 1, 2])
# a.shape gives (3, None, 4) - Where None has 1,3,1 dimensions
然后,我们将中值应用于上述张量的每一行
- 每行张量的中值为:
def median(x):
return tfp.stats.percentile(x[None,...], 50.0, interpolation='midpoint', axis=1)
- 段中值
def segment_median(data, segment_ids):
def median(x):
return tfp.stats.percentile(x[None,...], 50.0, interpolation='midpoint', axis=1)
ragged = tf.RaggedTensor.from_value_rowids(values=data, value_rowids=segment_ids)
m = tf.map_fn(lambda x: median(x), ragged )
return tf.squeeze(tf.stack(m))
segment_median(x,tf.constant([0,1,1,2]((返回
<tf.Tensor: shape=(3, 4), dtype=float32, numpy=
array([[0.1, 0.2, 0.4, 0.5],
[0.1, 0.2, 0.2, 0.6],
[0.1, 0.1, 0.6, 0.5]], dtype=float32)>