tensorflow踩坑合集1. feature_column


踩坑內容包含以下

  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,原始特征如下

輸入-連續值

輸入-離散值

輸入-categorical

feature_column接estimator

如果是使用預定義的estimator, feature_column可以直接作為輸入,不需要任何額外操作,只需要注意深度模型只支持Dense類型的feature_column即可。

如果是自定義estimator,則需要多一步用feature_column先創建input_layer

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輸入的,所以以下代碼會報錯

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的

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的官方文檔確實坑而已。。。

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

持續更新中...


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM