Tensorflow:有没有办法建立一个没有tf.bincount的加权直方图?

时间:2017-07-17 15:16:22

标签: python tensorflow gpu-programming tensorflow-gpu

在我看来,numpy函数bincount非常有用且易于使用,所以我自然会在TensorFlow中使用模拟函数。最近我了解到,遗憾的是tf.bincount没有GPU支持(正如您可以阅读here)。有没有其他方法可以在TensorFlow 中使用 GPU并且有效地进行加权直方图(如下例所示)?

sess = tf.Session()

values = tf.random_uniform((1,50),10,20,dtype = tf.int32)
weights = tf.random_uniform((1,50),0,1,dtype = tf.float32)

counts = tf.bincount(values, weights = weights)

histogram = sess.run(counts)
print(histogram)

1 个答案:

答案 0 :(得分:1)

根据ekelsen on GitHub的建议,tf.bincount的高效且GPU支持的替代方法是tf.unsorted_segment_sum。 您可以在documentation中阅读,您可以使用权重为data的函数,值为segments_ids。第三个参数num_segments应该≥Bitcount返回的直方图的大小(如果>您将在前一个直方图的最后一个之后只有零个元素)。在上面的例子中,它将是:

sess = tf.Session()

values = tf.random_uniform((1,50),10,20,dtype = tf.int32)
weights = tf.random_uniform((1,50),0,1,dtype = tf.float32)
bins = 50
counts = tf.unsorted_segment_sum(weights, values, bins)

histogram = sess.run(counts)
print(histogram)

和输出:

[ 0.          0.          0.          0.          0.          
  0.          0.          0.          0.          0.          
  2.92621088  1.12118244  2.79792929  0.96016133  2.75781202  
  2.55233836  2.71923089  0.75750649  2.84039998  3.41356659  
  0.          0.          0.          0.          0.          
  0.          0.          0.          0.          0.        ]