2

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

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)
4

1 回答 1

2

正如ekelsen在 GitHub 上所建议的那样,一种高效且受 GPU 支持的替代方法tf.bincounttf.unsorted_segment_sum. 正如您在文档中所读到的,您可以使用带有权重 as data、值 as的函数segments_ids。第三个参数num_segments应该≥ bincount 返回的直方图的大小(如果 > 在前一个直方图的最后一个之后,您将只有零个元素)。在我上面的示例中,它将是:

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.        ]
于 2017-07-21T10:13:40.140 回答