如何获得张量中元素的计数

时间:2016-04-10 14:22:36

标签: python tensorflow

我想获得张量中元素的计数,例如,t = [1,2,0,0,0,0](t是张量),我可以得到4的量'0'通过在python中调用t.count(0),但在tensorflow中,我找不到任何函数来执行此操作。我如何得到'0'的数量?可以请别人帮帮我吗?

2 个答案:

答案 0 :(得分:7)

要计算一个特定的元素,你可以创建一个布尔掩码,将其转换为int并总结:

import tensorflow as tf

X = tf.constant([6, 3, 3, 3, 0, 1, 3, 6, 7])
res = tf.reduce_sum(tf.cast(tf.equal(X, 3), tf.int32))
with tf.Session() as sess:
    print sess.run(res)

此外,您可以使用tf.unique_with_counts;

计算列表/张量中的每个元素
import tensorflow as tf

X = tf.constant([6, 3, 3, 3, 0, 1, 3, 6, 7])
y, idx, cnts = tf.unique_with_counts(X)
with tf.Session() as sess:
    a, _, b = sess.run([y, idx, cnts])
    print a
    print b

答案 1 :(得分:2)

上面对Slater的回答的补充。如果您想获得 all 元素的计数,可以使用one_hotreduce_sum来避免在python中进行任何循环。例如,下面的代码片段返回一个词汇,按word_tensor中的出现次序排序。

def build_vocab(word_tensor, vocab_size): 
  unique, idx = tf.unique(word_tensor)
  counts_one_hot = tf.one_hot(
      idx, 
      tf.shape(unique)[0],
      dtype=tf.int32
  )
  counts = tf.reduce_sum(counts_one_hot, 0)
  _, indices = tf.nn.top_k(counts, k=vocab_size)
  return tf.gather(unique, indices)
编辑:经过一些实验,我发现one_hot张量很容易超过TF的最大张量大小。使用类似的内容替换counts调用可能更有效(如果不那么优雅):

counts = tf.foldl(
  lambda counts, item: counts + tf.one_hot(
      item, tf.shape(unique)[0], dtype=tf.int32),
  idx,
  initializer=tf.zeros_like(unique, dtype=tf.int32),
  back_prop=False
)