从TensorFlow中的矩阵中删除零向量

问题描述 投票:0回答:2

就像问题所说,我试图从张量中删除所有零向量(即[0, 0, 0, 0])。

鉴于:

array([[ 0.        ,  0.        ,  0.        ,  0.        ],
   [ 0.19999981,  0.5       ,  0.        ,  0.        ],
   [ 0.4000001 ,  0.29999995,  0.10000002,  0.        ],
   ..., 
   [-0.5999999 ,  0.        , -0.0999999 , -0.20000005],
   [-0.29999971, -0.4000001 , -0.30000019, -0.5       ],
   [ 0.        ,  0.        ,  0.        ,  0.        ]], dtype=float32)

我曾尝试过以下代码(灵感来自this SO):

x = tf.placeholder(tf.float32, shape=(10000, 4))

zeros_vector = tf.zeros(shape=(1, 4), dtype=tf.float32)
bool_mask = tf.not_equal(x, zero_vector)

omit_zeros = tf.boolean_mask(x, bool_mask)

bool_mask似乎也有形状(10000,4),就像它将x张量中的每个元素都比较为零,而不是行。

我想过使用整个行为零的tf.reduce_sum,但是这也会省略像[1, -1, 0, 0]这样的行,我不希望这样。

想法?

python tensorflow
2个回答
3
投票

一种可能的方法是对行的绝对值求和,这样它就不会省略像[1, -1, 0, 0]这样的行,然后将它与零向量进行比较。你可以这样做:

intermediate_tensor = reduce_sum(tf.abs(x), 1)
zero_vector = tf.zeros(shape=(1,1), dtype=tf.float32)
bool_mask = tf.not_equal(intermediate_tensor, zero_vector)
omit_zeros = tf.boolean_mask(x, bool_mask)

0
投票

我尝试过Rudresh Panchal的解决方案,它对我不起作用。也许到期版本会改变。我在第一排找到了tipo:reduce_sum(tf.abs(x), 1) - > tf.reduce_sum(tf.abs(x), 1)

此外,bool_mask具有等级2而不是等级1,这是必需的:张量:N-D张量。 mask:K-D布尔张量,K <= N,K必须静态知道。换句话说,bool_mask的形状必须是例如[6]而不是[1,6]。 tf.squeeze适用于减少尺寸。

更正了适用于我的代码:

intermediate_tensor = tf.reduce_sum(tf.abs(x), 1)
zero_vector = tf.zeros(shape=(1,1), dtype=tf.float32)
bool_mask = tf.squeeze(tf.not_equal(intermediate_tensor, zero_vector))
omit_zeros = tf.boolean_mask(x, bool_mask)
© www.soinside.com 2019 - 2024. All rights reserved.