Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.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 使用Tensorflow稀疏传感器的有效布尔掩蔽_Python_Tensorflow_Sparse Matrix_Tensorflow2.0 - Fatal编程技术网

Python 使用Tensorflow稀疏传感器的有效布尔掩蔽

Python 使用Tensorflow稀疏传感器的有效布尔掩蔽,python,tensorflow,sparse-matrix,tensorflow2.0,Python,Tensorflow,Sparse Matrix,Tensorflow2.0,所以,我想屏蔽整个麻雀传感器的行。使用tf.boolean_mask很容易做到这一点,但是SparseTensors没有等价物。目前,对我来说,有一种可能的做法是,只需遍历SparseTensor.index中的所有索引,然后过滤掉所有非屏蔽行的索引,例如: masked_index=list(过滤器(lambda索引:masked_行[索引[0]],索引)) 其中,masked_rows是一个1D数组,表示该索引处的行是否被屏蔽 然而,这真的很慢,因为我的SparseTensor相当大(它有

所以,我想屏蔽整个
麻雀传感器的行。使用
tf.boolean_mask
很容易做到这一点,但是
SparseTensor
s没有等价物。目前,对我来说,有一种可能的做法是,只需遍历
SparseTensor.index中的所有索引,然后过滤掉所有非屏蔽行的索引,例如:

masked_index=list(过滤器(lambda索引:masked_行[索引[0]],索引))
其中,masked_rows是一个1D数组,表示该索引处的行是否被屏蔽

然而,这真的很慢,因为我的SparseTensor相当大(它有90k的指数,但将增长到更大)。在我对过滤后的索引应用
SparseTensor.mask
之前,在单个数据点上花费了相当多的时间。这种方法的另一个缺陷是,它实际上也没有删除行(尽管在我的例子中,一行全零也可以)


有没有更好的方法来掩盖一个麻雀传感器的行,或者这是最好的方法

您可以这样做:

import tensorflow as tf

def boolean_mask_sparse_1d(sparse_tensor, mask, axis=0):  # mask is assumed to be 1D
    mask = tf.convert_to_tensor(mask)
    ind = sparse_tensor.indices[:, axis]
    mask_sp = tf.gather(mask, ind)
    new_size = tf.math.count_nonzero(mask)
    new_shape = tf.concat([sparse_tensor.shape[:axis], [new_size],
                           sparse_tensor.shape[axis + 1:]], axis=0)
    new_shape = tf.dtypes.cast(new_shape, tf.int64)
    mask_count = tf.cumsum(tf.dtypes.cast(mask, tf.int64), exclusive=True)
    masked_idx = tf.boolean_mask(sparse_tensor.indices, mask_sp)
    new_idx_axis = tf.gather(mask_count, masked_idx[:, axis])
    new_idx = tf.concat([masked_idx[:, :axis],
                         tf.expand_dims(new_idx_axis, 1),
                         masked_idx[:, axis + 1:]], axis=1)
    new_values = tf.boolean_mask(sparse_tensor.values, mask_sp)
    return tf.SparseTensor(new_idx, new_values, new_shape)

# Test
sp = tf.SparseTensor([[1], [3], [4], [6]], [1, 2, 3, 4], [7])
mask = tf.constant([True, False, True, True, False, False, True])
out = boolean_mask_sparse_1d(sp, mask)
print(out.indices.numpy())
# [[2]
#  [3]]
print(out.values.numpy())
# [2 4]
print(out.shape)
# (4,)

等等,我不确定这是否正确,因为我不确定您是想“删除”(使零)稀疏张量中的屏蔽值,还是像
tf那样删除稀疏张量中的值。布尔屏蔽实际上是这样做的。我在想我发布的内容(“删除”值)可能不是您所想的。无论哪种方法都有效,我只是担心时间成本。这个解决方案对我来说很有意义,让我试试看,然后再告诉你。这个看起来很完美,这对我来说是一个巨大的性能提升。谢谢@porgull我意识到我以前的解决方案产生了不一致的结果,我现在修复了它,因此它可以像常规的
tf.boolean_mask
一样正常工作。啊,太棒了,我感谢它@jdehesa