正确使用TensorFlow Transform apply_buckets

时间:2019-07-17 17:50:37

标签: python tensorflow tensorflow-transform

这是在TensorFlow 1.11.0上的。 tft.apply_buckets中的documentation不是很具描述性。具体来说,我读到: “ bucket_boundaries:以2级张量表示的存储区边界。”

我认为这必须是存储区索引和存储区边界?

当我尝试以下玩具示例时:

import tensorflow as tf
import tensorflow_transform as tft
import numpy as np

tf.enable_eager_execution()

x = np.array([-1,9,19, 29, 39])
xt = tf.cast(
        tf.convert_to_tensor(x),
        tf.float32
        )

boundaries = tf.cast(
                tf.transpose(
                    tf.convert_to_tensor([[0, 1, 2, 3], [10, 20, 30, 40]])
                    ),
                tf.float32
                )

buckets = tft.apply_buckets(xt, boundaries)

我得到:

InvalidArgumentError: Expected sorted boundaries [Op:BucketizeWithInputBoundaries] name: assign_buckets

请注意,在这种情况下,xbucket_boundaries参数是:

tf.Tensor([-1.  9. 19. 29. 39.], shape=(5,), dtype=float32)
tf.Tensor(
[[ 0. 10.]
 [ 1. 20.]
 [ 2. 30.]
 [ 3. 40.]], shape=(4, 2), dtype=float32)

因此,似乎bucket_boundaries不应被视为索引和边界。有人知道如何正确使用此方法吗?

2 个答案:

答案 0 :(得分:2)

经过一番摸索,我发现bucket_boundaries应该是一个二维数组,其中条目是存储区边界,并且包装了该数组,因此有两列。请参见下面的示例:

import tensorflow as tf
import tensorflow_transform as tft
import numpy as np

tf.enable_eager_execution()

x = np.array([-1,9,19, 29, 39])
xt = tf.cast(
        tf.convert_to_tensor(x),
        tf.float32
        )

boundaries = tf.cast(
                tf.transpose(
                    tf.convert_to_tensor([[0, 20, 40, 60], [10, 30, 50, 70]])
                    ),
                tf.float32
                )

buckets = tft.apply_buckets(xt, boundaries)

因此,预期的输入是:

print (xt)
print (buckets)
print (boundaries)
tf.Tensor([-1.  9. 19. 29. 39.], shape=(5,), dtype=float32)
tf.Tensor([0 1 2 3 4], shape=(5,), dtype=int64)
tf.Tensor(
[[ 0. 10.]
 [20. 30.]
 [40. 50.]
 [60. 70.]], shape=(4, 2), dtype=float32)

答案 1 :(得分:1)

想要添加到此,因为这是Google搜索“ tft.apply_buckets”的唯一结果:)

我的示例在最新版本的TFT中不起作用。以下代码对我有用。

请注意,存储桶被指定为2级张量,但内部尺寸中只有一个元素。

(我使用了错误的单词,但希望下面的示例能够阐明这一点)

import tensorflow as tf
import tensorflow_transform as tft
import numpy as np

tf.enable_eager_execution()

xt = tf.cast(tf.convert_to_tensor(np.array([-1,9,19, 29, 39])),tf.float32)
bds = [[0],[10],[20],[30],[40]]
boundaries = tf.cast(tf.convert_to_tensor(bds),tf.float32)
buckets = tft.apply_buckets(xt, boundaries)

感谢您的帮助,因为这个答案带给了我大部分帮助!

其余的我从TFT源代码中找到: https://github.com/tensorflow/transform/blob/deb198d59f09624984622f7249944cdd8c3b733f/tensorflow_transform/mappers.py#L1697-L1698