Python 如何仅对张量中的非零项求平均值?
我遇到了一个例子,其中平均值包括填充值。给定某种形状的张量Python 如何仅对张量中的非零项求平均值?,python,tensorflow,keras,Python,Tensorflow,Keras,我遇到了一个例子,其中平均值包括填充值。给定某种形状的张量X(批量大小,…,特征),可能存在零填充特征以获得相同的形状 如何平均X(特征)的最终尺寸,而仅计算非零条目?所以,我们用和除以非零条目的数量 输入示例: x = [[[[1,2,3], [2,3,4], [0,0,0]], [[1,2,3], [2,0,4], [3,4,5]], [[1,2,3], [0,0,0], [0,0,0]], [[1,2,3], [1,2,3], [0,0,0]]],
X
(批量大小,…,特征),可能存在零填充特征以获得相同的形状
如何平均X
(特征)的最终尺寸,而仅计算非零条目?所以,我们用和除以非零条目的数量
输入示例:
x = [[[[1,2,3], [2,3,4], [0,0,0]],
[[1,2,3], [2,0,4], [3,4,5]],
[[1,2,3], [0,0,0], [0,0,0]],
[[1,2,3], [1,2,3], [0,0,0]]],
[[[1,2,3], [0,1,0], [0,0,0]],
[[1,2,3], [2,3,4], [0,0,0]],
[[1,2,3], [0,0,0], [0,0,0]],
[[1,2,3], [1,2,3], [1,2,3]]]]
# Desired output
y = [[[1.5 2.5 3.5]
[2. 2. 4. ]
[1. 2. 3. ]
[1. 2. 3. ]]
[[0.5 1.5 1.5]
[1.5 2.5 3.5]
[1. 2. 3. ]
[1. 2. 3. ]]]
纯Keras解决方案计算非零条目的数量,然后相应地除以总和。这是一个自定义图层:
import keras.layers as L
import keras.backend as K
class NonZeroMean(L.Layer):
"""Compute mean of non-zero entries."""
def call(self, x):
"""Calculate non-zero mean."""
# count the number of nonzero features, last axis
nonzero = K.any(K.not_equal(x, 0.0), axis=-1)
n = K.sum(K.cast(nonzero, 'float32'), axis=-1, keepdims=True)
x_mean = K.sum(x, axis=-2) / n
return x_mean
def compute_output_shape(self, input_shape):
"""Collapse summation axis."""
return input_shape[:-2] + (input_shape[-1],)
我假设需要添加一个条件来检查所有特征是否为零并返回零,否则我们将得到一个零除错误。当前示例使用以下工具进行测试:
# Dummy data
x = [[[[1,2,3], [2,3,4], [0,0,0]],
[[1,2,3], [2,0,4], [3,4,5]],
[[1,2,3], [0,0,0], [0,0,0]],
[[1,2,3], [1,2,3], [0,0,0]]],
[[[1,2,3], [0,1,0], [0,0,0]],
[[1,2,3], [2,3,4], [0,0,0]],
[[1,2,3], [0,0,0], [0,0,0]],
[[1,2,3], [1,2,3], [1,2,3]]]]
x = np.array(x, dtype='float32')
# Example run
x_input = K.placeholder(shape=x.shape, name='x_input')
out = NonZeroMean()(x_input)
s = K.get_session()
print("INPUT:", x)
print("OUTPUT:", s.run(out, feed_dict={x_input: x}))
我认为你所展示的期望输出是“倒数第二”轴上的平均值,而不是最后一个轴,对吗?是的,你是对的,答案也是倒数第二个轴上的总和。谢谢