Tensorflow:有没有办法在没有 tf.bincount 的情况下构建加权直方图?
Tensorflow: is there a way to build a weighted histogram without tf.bincount?
在我看来,numpy 函数bincount
非常有用且易于使用,所以我很自然地使用 TensorFlow 中的模拟函数。最近我得知不幸的是 tf.bincount
没有 GPU 支持(你可以阅读 here)。有没有其他方法可以在 TensorFlow with 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. ]
在我看来,numpy 函数bincount
非常有用且易于使用,所以我很自然地使用 TensorFlow 中的模拟函数。最近我得知不幸的是 tf.bincount
没有 GPU 支持(你可以阅读 here)。有没有其他方法可以在 TensorFlow with 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. ]