如何根据tensorflow 1.10中的张量值将(m,50)张量减少到(m,25)张量

How to reduce (m, 50) tensor to (m, 25) tensor based on tensor value in tensorflow 1.10

例如,

# (m, 50) tensor a
print(a)

<tf.Tensor: id=11543, shape=(3, 50), dtype=int32, numpy=
array([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 15, 32, 1, 1, 7, 1, 1, 1, 1, 1, 1, 1,
        1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0],
       [1, 1, 1, 1, 1, 11, 1, 1, 1, 11, 1, 1, 1, 1, 1, 8, 1, 1, 1, 1, 1, 1,
        1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0],
       [1, 1, 1, 1, 1, 421, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 1, 1, 1, 1, 1, 1,
        1, 1, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0]], dtype=int32)>

# (m, 50) tensor b
print(b)
<tf.Tensor: id=20624, shape=(3, 50), dtype=int32, numpy=
array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
        1, 1, 1, 1, 1, 1],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
        1, 1, 1, 1, 1, 1],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 1, 11, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
        1, 1, 1, 1, 142, 1]], dtype=int32)

张量的形状是(m, 50),一半全是0,所以我想把张量缩减成(m, 25),去掉一半全是0。
我想知道如何在 tf 1.10.

中实现它

我假设已知每行中零的数量恰好代表该列大小的一半。如果不是,则删除零将导致不规则的张量(具有不同维度大小的张量),tf v1.10.0.

不支持该张量

您可以在张量中的元素大于 0 的地方创建一个掩码,然后使用 tf.boolean_mask 将它们掩码掉(而且我们将不得不重塑结果,因为 tensorflow 1.10 无法推断出新的形状) .

import tensorflow as tf


# using the `a` defined in your question
mask = tf.cast(a > 0, dtype=tf.int32)
result = tf.boolean_mask(a, mask)
result = tf.reshape(result, (3, 25))


with tf.Session() as sess:
    print(result.eval())

# [[  1   1   1   1   1   1   1   1   1   1  15  32   1   1   7   1   1   1
#     1   1   1   1   1   1   1]
#  [  1   1   1   1   1  11   1   1   1  11   1   1   1   1   1   8   1   1
#     1   1   1   1   1   1   1]
#  [  1   1   1   1   1 421   1   1   1   1   1   1   1   1   1  12   1   1
#     1   1   1   1   1   1  42]]