一.引言

Tensorflow Esitimator 场景下常用到 feature column 对原始特征进行处理,TF1 与 TF2 在 feature column 的使用上有一些不同,下面通过两个简单例子区分。

二.TF 1.x feature column

1.定义特征列

常见的特征列如下,这里我们结合 bucketized_column + numeric_column 构造特征列

CSDN-BITDDD

年龄分桶,这里通过 10-90 作为边界,形成了10个分桶。

    age_bucket = tf.feature_column.bucketized_column(
        tf.feature_column.numeric_column(key='age_bucket', shape=(1,),
                                         default_value=0,
                                         dtype=tf.dtypes.float32),
        boundaries=[10.0, 20.0, 30.0, 40.0, 50.0, 60.0, 70.0, 80.0, 90.0])

2.通过特征列处理特征

通过 feature_column.input_layer 处理 features 得到 dense feature。

    age_bucket = tf.feature_column.bucketized_column(
        tf.feature_column.numeric_column(key='age_bucket', shape=(1,),
                                         default_value=0,
                                         dtype=tf.dtypes.float32),
        boundaries=[10.0, 20.0, 30.0, 40.0, 50.0, 60.0, 70.0, 80.0, 90.0])

示例:

fetures 构造特征 Map,通过与 feature_column 相同的 key 建立关联,得到特征值的 one-hot 向量,这里特征值维度为3,分桶数为10,所以最终的结果维度为 3x10。

    features = {}
    features['age_bucket'] = [[23.0], [35.0], [68.0]]
    one_hot = tf.feature_column.input_layer(features, [age_bucket])

    with tf.Session() as sess:
        print(sess.run(one_hot))
Tensor("input_layer/concat:0", shape=(3, 10), dtype=float32)
[[0. 0. 1. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]]

三.TF 2.x feature column

在 TF2 复现代码时,发现很多 TF1 的 API 已经不支持了,定义特征列的方法没有变,但是调用特征列生成对应特征的方式发生了改变。

1.定义特征列

特征列定义不变,仍然是 bucketized_column + numeric_column 构造的年龄分桶。

    age_bucket = tf.feature_column.bucketized_column(
        tf.feature_column.numeric_column(key='age_bucket', shape=(1,),
                                         default_value=0,
                                         dtype=tf.dtypes.float32),
        boundaries=[10.0, 20.0, 30.0, 40.0, 50.0, 60.0, 70.0, 80.0, 90.0])

2.通过特征列处理特征

通过 layers.DenseFeatures 处理 features 得到 dense feature。

class DenseFeatures(dense_features.DenseFeatures):
    def __init__(self,
               feature_columns,
               trainable=True,
               name=None,
               **kwargs):
    super(DenseFeatures, self).__init__(
        feature_columns=feature_columns,
        trainable=trainable,
        name=name,
        **kwargs)
    self._state_manager = fc._StateManagerImplV2(self, self.trainable)  # pylint: disable=protected-access

示例: 

    features = {}
    features['age_bucket'] = [[23.0], [35.0], [68.0]]
    feature_layer = tf.keras.layers.DenseFeatures(age_bucket)
    inputs = feature_layer(features)  
    print(inputs)

通过 bucket- feature_column 可以得到 None x BucketSize 的 one-hot 向量。TF1 与 TF2 的主要区别就是特征处理阶段,前者通过 feature_column 的 input_layer API 实现 ,后者则可以通过 layers.DenseFeatures 实现,其中 input_layer 接口已经不存在。

tf.Tensor(
[[0. 0. 1. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]], shape=(3, 10), dtype=float32)

更多推荐算法相关深度学习:深度学习导读专栏 

更多推荐