张量流中值

2024-05-13 20:14:16 发布

您现在位置:Python中文网/ 问答频道 /正文

如何计算tensorflow中列表的中值? 就像

node = tf.median(X)

X是占位符
在numpy中,我可以直接使用np.median来得到中值。如何使用tensorflow中的numpy操作?


Tags: numpynode列表tftensorflownpmedian
3条回答

编辑:此答案已过时,请改用Lucas Venezian Povoa的解决方案。它更简单更快。

可以使用以下方法计算tensorflow内部的中值:

def get_median(v):
    v = tf.reshape(v, [-1])
    mid = v.get_shape()[0]//2 + 1
    return tf.nn.top_k(v, mid).values[-1]

如果X已经是向量,则可以跳过重塑。

如果您关心中值是偶数大小向量的两个中间元素的平均值,则应改为使用此值:

def get_real_median(v):
    v = tf.reshape(v, [-1])
    l = v.get_shape()[0]
    mid = l//2 + 1
    val = tf.nn.top_k(v, mid).values
    if l % 2 == 1:
        return val[-1]
    else:
        return 0.5 * (val[-1] + val[-2])

我们可以修改BlueSun的解决方案,使其在GPU上更快:

def get_median(v):
    v = tf.reshape(v, [-1])
    m = v.get_shape()[0]//2
    return tf.reduce_min(tf.nn.top_k(v, m, sorted=False).values)

这与(以我的经验)使用tf.contrib.distributions.percentile(v, 50.0)一样快,并返回一个实际元素。

要使用tensorflow计算数组的中值,可以使用^{}函数,因为第50个百分点是中值。

import tensorflow as tf
import tensorflow_probability as tfp
import numpy as np 

np.random.seed(0)   
x = np.random.normal(3.0, .1, 100)

median = tfp.stats.percentile(x, 50.0, interpolation='midpoint')

tf.Session().run(median)

上面的代码相当于^{}(x, 50, interpolation='midpoint')

相关问题 更多 >