Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何仅对张量中的非零项求平均值?_Python_Tensorflow_Keras - Fatal编程技术网

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}))

我认为你所展示的期望输出是“倒数第二”轴上的平均值,而不是最后一个轴,对吗?是的,你是对的,答案也是倒数第二个轴上的总和。谢谢