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