numpy TensorFlow -在计算Tensor的平均值时忽略无限值

9q78igpj  于 2023-05-29  发布在  其他
关注(0)|答案(3)|浏览(141)

这可能是一个基本问题,但我找不到解决方案:
我需要计算Tensor的平均值忽略任何非有限值。
例如,mean([2.0, 3.0, inf, 5.0])应该返回3.333,而不是inf2.5
我尝试了sess.run(tf.reduce_mean([2.0, 3.0, inf, 5.0])),但它返回inf

qojgxg4l

qojgxg4l1#

您可以使用is_finiteboolean_mask的组合。

import tensorflow as tf

x = tf.constant([2, 3, float('Inf'), 5])
mymean = tf.reduce_mean(tf.boolean_mask(x, tf.is_finite(x)))

sess = tf.Session()
sess.run(mymean)

请注意,is_finite也将删除NaN值。

cmssoen2

cmssoen22#

给出的答案几乎是正确的。问题是关于忽略 * 非有限 * 值,答案是只忽略 * 无限 * 值。他们不是一回事,特别是关于 nan
要实际忽略任何非有限值(包括nan),请使用以下稍微简单的行:

mymean = tf.reduce_mean(tf.boolean_mask(x, tf.is_finite(x))
uemypmqf

uemypmqf3#

公认的答案对于完全约简很有效,但是,如果只想在某些轴上使用reduce_mean,则需要更复杂的方法:

def reduce_nanmean(tensor, axis=None):
    mask = tf.math.is_finite(tensor)
    numerator = tf.reduce_sum(tf.where(mask, tensor, tf.zeros_like(tensor)), axis=axis)
    denominator = tf.reduce_sum(tf.cast(mask, dtype=tf.float32), axis=axis)
    return numerator / denominator

为了获得分子,函数在对Tensor中的数字求和之前将非有限数字(NaN,Inf)替换为零。为了得到分母(即有限数的个数),它对一个布尔掩码求和,这个掩码屏蔽了非有限数。

相关问题