一.引言
Tensorflow Esitimator 场景下常用到 feature column 对原始特征进行处理,TF1 与 TF2 在 feature column 的使用上有一些不同,下面通过两个简单例子区分。
二.TF 1.x feature column
1.定义特征列
常见的特征列如下,这里我们结合 bucketized_column + numeric_column 构造特征列
年龄分桶,这里通过 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)
更多推荐算法相关深度学习:深度学习导读专栏