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

时间:2017-06-25 08:30:00

标签: python tensorflow

就像问题所说,我试图从张量中删除所有零向量(即[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]之类的行,我不希望这样。

想法?

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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)

答案 2 :(得分:0)

只需将张量转换为tf.bool并将其用作布尔掩码:

boolean_mask = tf.cast(x, dtype=tf.bool)              
no_zeros = tf.boolean_mask(x, boolean_mask, axis=0)