如何根据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]]
例如,
# (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]]