前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >tensorflow feature_column踩坑合集

tensorflow feature_column踩坑合集

作者头像
风雨中的小七
修改2020-05-17 15:42:09
2.5K2
修改2020-05-17 15:42:09
举报

踩坑内容包含以下

  1. feature_column的输入输出类型,用一个数据集给出demo
  2. feature_column接estimator
  3. feature_column接Keras

feature_column 输入输出类型

输入输出类型

feature_column输入可以是原始特征的列名,或者是feature_column。初上手感觉feature_column设计的有点奇怪,不过熟悉了逻辑后用起来还是很方便的。几个需要习惯一下的点:

  1. 深度模型的输入必须是Dense类型,所有输出是categorical类型需要经过indicator或者embedding的转换才可以
  2. indicator, embedding, bucketized的输入不能是原始特征,前两者只能是categorical类型的feature_column, 后者只能是numeric_column

feature_column

输入

输出

输出是否为dense

categorical_column_with_identity

数值型离散

categorical

N

categorical_column_with_vocabulary_list

字符型/数值型离散

categorical

N

categorical_column_with_hash_bucket

类别太多的离散值

categorical

N

crossed_column

categorical/离散值

categorical

N

indicator_column

categorical

one/multi-hot

Y

embedding_column

categorical

dense vector

Y

numeric_column

数值型连续值

numeric

Y

bucketzied_column

numeric_column

one-hot

Y

以下给出各种特征工程的demo,原始特征如下

image.png-252.2kB
image.png-252.2kB

输入-连续值

image.png-170.8kB
image.png-170.8kB

输入-离散值

image.png-286.2kB
image.png-286.2kB

输入-categorical

image.png-290kB
image.png-290kB

feature_column接estimator

如果是使用预定义的estimator, feature_column可以直接作为输入,不需要任何额外操作,只需要注意深度模型只支持Dense类型的feature_column即可。

如果是自定义estimator,则需要多一步用feature_column先创建input_layer

代码语言:javascript
复制
input_layer = tf.feature_column.input_layer(features, feature_columns)

如果input_layer之后连接的是tf.layers,那直接进行操作即可,如果是进行自定义variable的各种操作,还有一个坑!因为上面input_layer的shape需要动态地赋给tf.get_vairable但tf.get_variable是不接受TensorShape作为shape输入的,所以以下代码会报错

代码语言:javascript
复制
input_dim = input.get_shape().as_list()[-1]
w = tf.get_variable('w', shape = [input_dim,1], dtype = tf.float32, validate_shape = False)

绕过的办法就是使用initializer, 因为initializer是可以动态定义shape的

代码语言:javascript
复制
input_dim = input.get_shape().as_list()[-1]
init = tf.random_normal( shape = (input_dim,1) )
w = tf.get_variable('w', dtype = tf.float32, initializer = init, validate_shape = False)

feature_column接keras

为什么要这么搭配呢,好像是没啥必要,只不过进一步证明tf的官方文档确实坑而已。。。

代码语言:javascript
复制
def model_fn():
    #define Keras input 
    input = {}
    for f in FEATURE_NAME:
        input[f] = Input(shape=(1,), name = f, dtype = DTYPE[f])
    #generate feature_columns
    feature_columns = build_features()
    
    #Define transformation from feature_columns to Dense Tensor 
    feature_layer = tf.keras.layers.DenseFeatures( feature_columns )
    #Transform input 
    dense_feature = feature_layer(input)
    
    output = Dense(1, activation='sigmoid')(dense_feature)
    #feed input placeholder as list 
    model = Model(inputs = [i for i in input.values()], outputs = output)

    return model

持续更新中...

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-03-07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • feature_column 输入输出类型
    • 输入输出类型
      • 输入-连续值
        • 输入-离散值
          • 输入-categorical
          • feature_column接estimator
          • feature_column接keras
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档