Bucketize 实值张量

Posted

技术标签:

【中文标题】Bucketize 实值张量【英文标题】:Bucketize real valued Tensor 【发布时间】:2019-11-04 16:36:48 【问题描述】:

我有一个这样的矩阵:

tf_ent = tf.Variable([   [9.96,    8.65,    0.8,    0.1 ],
                         [0.7,     8.33,    0  ,    0   ],
                         [0.9,     0,       6,      7.33],
                         [6.60,    0,       3,      5.5 ],
                         [9.49,    0.,      0,      0   ],
                         [0.4,     8.45,    0,      0.2 ],
                         [0.3,     0,       5.82,   8.28]])

我想得到一个输出,其中相同范围内的权重得到相同的number

换句话说,这个数字很好地代表了矩阵中的weight range

所以我的理想输出可能是这样的:

                [[5,    5,    1,    1],
                 [1,    5,    0,    0],
                 [1,    0,    6,    5],
                 [4,    0,    2,    3],
                 [5,    0.,   0,    0],
                 [1,    5,    0,    1],
                 [1,    0,    3,    5]]

在这种情况下,我用这个条件映射(考虑我有我的映射):

range(0.1, 1) -> 1
range( 1, 3) -> 2
range( 3, 5) -> 3
range(5, 7) -> 4
range (7, 10) -> 5

首先我尝试使用tf.histogram_fixed_width_bins,但它没有给我预期的结果: 这是我的代码:

value_ranges = [0, 10.0]
nbins = 5
new_f_w_t = tf.histogram_fixed_width_bins(tf_ent, value_ranges, nbins)
print(new_f_w_t)

这是这段代码的输出:

output= [[4 4 0 0]
        [0 4 0 0]
        [0 0 3 3]
        [3 0 1 2]
        [4 0 0 0]
        [0 4 0 0]
        [0 0 2 4]]

输出更像是获得这些浮点数的等效整数,而不是考虑任何范围。

如何以有效的方式获得矩阵的动态映射?

提前致谢:)

【问题讨论】:

【参考方案1】:

这相当于np.digitize 操作。你可以使用math_ops._bucketize:

from tensorflow.python.ops import math_ops

bins = [0.1, 1, 3, 5, 7, 10]
new_f_w_t = math_ops._bucketize(tf_ent, boundaries=bins)

new_f_w_t.numpy()
array([[5, 5, 1, 1],
       [1, 5, 0, 0],
       [1, 0, 4, 5],
       [4, 0, 3, 4],
       [5, 0, 0, 0],
       [1, 5, 0, 1],
       [1, 0, 4, 5]], dtype=int32)

【讨论】:

@sariii 不能代表开发者,但也许他们不认为它是一个非常常用的功能,或者认为histogram* 方法就足够了。 @sariii 您的输入和 bin 是否与此处描述的相同?我在 TensorFlow 2.0 上运行它,它运行良好。 是的,我只是复制粘贴,也许我的 tensorflow 有问题,我研究了一下,:) 你的方法似乎是我想要的,再次感谢。 这是 tensorflow 问题,非常感谢:) @sariii 嗯,不。问问自己,您将在哪个索引处将 9.96 插入bins?对数组中的每个元素重复此操作。这就是bucketize 所做的。【参考方案2】:

tf.searchsorted() 调用也可以用于此目的,这样可以避免调用隐藏的 _bucketize 函数。不过,您必须平铺箱以匹配输入值的尺寸。

例如:

bins = tf.tile([[0.1, 1, 3, 5, 7, 10]], (tf_ent.shape[0], 1))
new_f_w_t = tf.searchsorted(bins, tf_ent, side="right")

【讨论】:

以上是关于Bucketize 实值张量的主要内容,如果未能解决你的问题,请参考以下文章

当订单保存无关紧要时,uint64s序列的最佳压缩方法

Matlab LBP 实值

实值输入深度信念网络(RBM)的问题

返回一个实值的相位加扰时间序列

如何让 HMM 在 TensorFlow 中处理实值数据

C++STL整理