Skip to main content
 首页 » 编程设计

python之Tensorflow:有没有办法在没有 tf.bincount 的情况下构建加权直方图

2024年10月01日25daizhj

在我看来,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) 

请您参考如下方法:

根据 ekelsen on GitHub 的建议,tf.bincount 的一种高效且受 GPU 支持的替代方法是 tf.unsorted_segment_sum。 正如您在 documentation 中所读到的那样,您可以使用权重作为 data,值作为 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.        ]