就像问题所说,我试图从张量中删除所有零向量(即[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]
这样的行,我不希望这样。
想法?
一种可能的方法是对行的绝对值求和,这样它就不会省略像[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)
我尝试过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)