TensorFlow特徴工事:feature_column
16312 ワード
ウィーチャットを開いてスキャンして、ウィーチャットの公衆番号に関心を持ちます. 転載は出典を明記してください.http://blog.csdn.net/gamer_gyt ブログ主ミニブログ:http://weibo.com/234654758 Github:https://github.com/thinkgamer
特徴工事:フィーチャーcolumn
多くのモデルを使う時、入力したデータを必要とする特徴工程処理が必要です.最も典型的なのは、one-hot処理、そしてhashドラム缶などの処理です.これらの特徴を簡単に処理するために、テナントflowはいくつかの列の特徴的な工事方法を提供して、使いやすいです.
共通のimport
import tensorflow as tf
from tensorflow.python.estimator.inputs import numpy_io
import numpy as np
import collections
from tensorflow.python.framework import errors
from tensorflow.python.platform import test
from tensorflow.python.training import coordinator
from tensorflow import feature_column
from tensorflow.python.feature_column.feature_column import _LazyBuilder
numeric_column
numeric_column(
key,
shape=(1,),
default_value=None,
dtype=tf.float32,
normalizer_fn=None
)
def test_numeric():
price = {'price': [[1.], [2.], [3.], [4.]]} # 4
builder = _LazyBuilder(price)
def transform_fn(x):
return x + 2
price_column = feature_column.numeric_column('price', normalizer_fn=transform_fn)
price_transformed_tensor = price_column._get_dense_tensor(builder)
with tf.Session() as session:
print(session.run([price_transformed_tensor]))
# input_layer
price_transformed_tensor = feature_column.input_layer(price, [price_column])
with tf.Session() as session:
print('use input_layer' + '_' * 40)
print(session.run([price_transformed_tensor]))
test_numeric()
[array([[ 3.],
[ 4.],
[ 5.],
[ 6.]], dtype=float32)]
use input_layer________________________________________
[array([[ 3.],
[ 4.],
[ 5.],
[ 6.]], dtype=float32)]
上記の結果から、tranform_fnはすべての数値+2を処理した._を使うLazyBuiderとinpu_layerはそれぞれテストを行いました.効果は同じです.bucketized_column
bucketized_column(
source_column,
boundaries
)
ソレックスcolumn:numericでなければなりません.columnboundaries:違うバケツです.boundaries=[0.,1.,2.]で発生したbucketは、(-inf,0.),[0.,1.),[1.,2.),and[2.+inf]で、各区間はそれぞれ0,1,2,3を表しています.
def test_bucketized_column():
price = {'price': [[5.], [15.], [25.], [35.]]} # 4
price_column = feature_column.numeric_column('price')
bucket_price = feature_column.bucketized_column(price_column, [0, 10, 20, 30, 40])
price_bucket_tensor = feature_column.input_layer(price, [bucket_price])
with tf.Session() as session:
print(session.run([price_bucket_tensor]))
test_bucketized_column()
[array([[ 0., 1., 0., 0., 0., 0.],
[ 0., 0., 1., 0., 0., 0.],
[ 0., 0., 0., 1., 0., 0.],
[ 0., 0., 0., 0., 1., 0.]], dtype=float32)]
私たちはドラム缶を見たら、直接にone-hot形式に変換します.categoricacacal ucolumn-with vocabulary ulist
categorical_column_with_vocabulary_list(
key,
vocabulary_list,
dtype=None,
default_value=-1,
num_oov_buckets=0
)
前のnumericと違って、ここで戻ってくるのはまばらなtenssorです.
def test_categorical_column_with_vocabulary_list():
color_data = {'color': [['R', 'R'], ['G', 'R'], ['B', 'G'], ['A', 'A']]} # 4
builder = _LazyBuilder(color_data)
color_column = feature_column.categorical_column_with_vocabulary_list(
'color', ['R', 'G', 'B'], dtype=tf.string, default_value=-1
)
color_column_tensor = color_column._get_sparse_tensors(builder)
with tf.Session() as session:
session.run(tf.global_variables_initializer())
session.run(tf.tables_initializer())
print(session.run([color_column_tensor.id_tensor]))
# dense, one-hot , multi-hot
color_column_identy = feature_column.indicator_column(color_column)
color_dense_tensor = feature_column.input_layer(color_data, [color_column_identy])
with tf.Session() as session:
session.run(tf.global_variables_initializer())
session.run(tf.tables_initializer())
print('use input_layer' + '_' * 40)
print(session.run([color_dense_tensor]))
test_categorical_column_with_vocabulary_list()
[SparseTensorValue(indices=array([[0, 0],
[0, 1],
[1, 0],
[1, 1],
[2, 0],
[2, 1],
[3, 0],
[3, 1]]), values=array([ 0, 0, 1, 0, 2, 1, -1, -1]), dense_shape=array([4, 2]))]
use input_layer________________________________________
[array([[ 2., 0., 0.],
[ 1., 1., 0.],
[ 0., 1., 1.],
[ 0., 0., 0.]], dtype=float32)]
categoricalCaucolumnuwithwary cuulistにとって返ってきたのは、sparserchutensorです.idu-utensorはこれが有効で、もう一つはNoneです.線形モデルにとってはsparsercuntensorを直接使用することができます.しかし、深さモデルにとってはsparserをdenstroleに変換する必要があります.の役割は、categoryから生まれたsparser tenserをdense tensに変換することです.注意:
categoricacal ucolumn withuhash baucket
categorical_column_with_hash_bucket(
key,
hash_bucket_size,
dtype=tf.string
)
categoryの数が多いと、指定されたcategoryを使って処理することができなくなります.このようなハッシュバケットを使って処理することができます.たとえば、単語を切った後の文は、このような方法で処理することができます.categoricalunwathuvocabury fileを使うのもいい選択です.hashubucketにとって、bucketusizeの選択は問題です.def test_categorical_column_with_hash_bucket():
color_data = {'color': [['R'], ['G'], ['B'], ['A']]} # 4
builder = _LazyBuilder(color_data)
color_column = feature_column.categorical_column_with_hash_bucket('color', 7)
color_column_tensor = color_column._get_sparse_tensors(builder)
with tf.Session() as session:
session.run(tf.global_variables_initializer())
session.run(tf.tables_initializer())
print(session.run([color_column_tensor.id_tensor]))
# dense, one-hot , multi-hot
color_column_identy = feature_column.indicator_column(color_column)
color_dense_tensor = feature_column.input_layer(color_data, [color_column_identy])
with tf.Session() as session:
session.run(tf.global_variables_initializer())
session.run(tf.tables_initializer())
print('use input_layer' + '_' * 40)
print(session.run([color_dense_tensor]))
test_categorical_column_with_hash_bucket()
[SparseTensorValue(indices=array([[0, 0],
[1, 0],
[2, 0],
[3, 0]]), values=array([5, 2, 6, 3]), dense_shape=array([4, 1]))]
use input_layer________________________________________
[array([[ 0., 0., 0., 0., 0., 1., 0.],
[ 0., 0., 1., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 1.],
[ 0., 0., 0., 1., 0., 0., 0.]], dtype=float32)]
上から見ると、このhash分け樽の選び方はとても重要です.今は3を選んで、RとBにとっては強烈な面に分けます.GとAは1つの中に入れます.hashausize=7をテストすると、R G B Aはそれぞれの桶に分けられています.値が大きいほど正確な分け桶になります.[SparseTensorValue(indices=array([[0, 0],
[1, 0],
[2, 0],
[3, 0]]), values=array([5, 2, 6, 3]), dense_shape=array([4, 1]))]
use input_layer________________________________________
[array([[ 0., 0., 0., 0., 0., 1., 0.],
[ 0., 0., 1., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 1.],
[ 0., 0., 0., 1., 0., 0., 0.]], dtype=float32)
categoricacacal ucolumn_withuidentitycategorical_column_with_identity(
key,
num_buckets,
default_value=None
)
これは連続する数字類の処理関数です.例えば、idは全部で10000個あるので、このような方式が使えます.しかし、多く使われていないなら、categorical ucolumnuwith baucketを使って再処理したほうがいいです.embeddinggghucolumn
embedding_column(
categorical_column,
dimension,
combiner='mean',
initializer=None,
ckpt_to_load_from=None,
tensor_name_in_ckpt=None,
max_norm=None,
trainable=True
)
sparsor tense tenssorをdense tensに変換します.DNNの入力にdense tens.embeddingを使う必要があります.共用するなら、必要なのはnameです.
def test_embedding():
color_data = {'color': [['R'], ['G'], ['B'], ['A']]} # 4
color_column = feature_column.categorical_column_with_vocabulary_list(
'color', ['R', 'G', 'B'], dtype=tf.string, default_value=-1
)
color_embeding = feature_column.embedding_column(color_column, 8)
color_embeding_dense_tensor = feature_column.input_layer(color_data, [color_embeding])
with tf.Session() as session:
session.run(tf.global_variables_initializer())
session.run(tf.tables_initializer())
print('embeding' + '_' * 40)
print(session.run([color_embeding_dense_tensor]))
test_embedding()
embeding________________________________________
[array([[-0.38754427, 0.00133941, 0.22987399, 0.10634357, 0.60504574,
0.09730898, -0.26186299, 0.37433708],
[-0.11320268, 0.0495495 , 0.45014769, 0.18113135, 0.07382802,
-0.18399857, -0.42906326, -0.4881283 ],
[ 0.45096871, -0.22977889, -0.28710714, -0.10303244, -0.34233567,
0.06112694, 0.11003948, 0.08152663],
[ 0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0. ]], dtype=float32)]
いずれも8次元のデータに変換され、ガウス分布を使用して初期化されます.Aはcatergoricalcoolumnに現れていないので、0を使って初期化されました.weighttedit gorical ucolum
weighted_categorical_column(
categorical_column,
weight_feature_key,
dtype=tf.float32
)
categoricalcoolumnのために重みを与えます.デフォルトのcategoricacacalcoucolumnでは、すべての重みは同じですが、時には同じ組のcategory ucolumnに対して異なるcategoryの重みが異なります.例えば、「テキスト」を使うと、(の重みは)違います.def test_weighted_categorical_column():
color_data = {'color': [['R'], ['G'], ['B'], ['A']],
'weight': [[1.0], [2.0], [4.0], [8.0]]} # 4
color_column = feature_column.categorical_column_with_vocabulary_list(
'color', ['R', 'G', 'B'], dtype=tf.string, default_value=-1
)
color_weight_categorical_column = feature_column.weighted_categorical_column(color_column, 'weight')
builder = _LazyBuilder(color_data)
with tf.Session() as session:
id_tensor, weight = color_weight_categorical_column._get_sparse_tensors(builder)
session.run(tf.global_variables_initializer())
session.run(tf.tables_initializer())
print('weighted categorical' + '-' * 40)
print(session.run([id_tensor]))
print('-' * 40)
print(session.run([weight]))
test_weighted_categorical_column()
weighted categorical----------------------------------------
[SparseTensorValue(indices=array([[0, 0],
[1, 0],
[2, 0],
[3, 0]]), values=array([ 0, 1, 2, -1]), dense_shape=array([4, 1]))]
----------------------------------------
[SparseTensorValue(indices=array([[0, 0],
[1, 0],
[2, 0],
[3, 0]]), values=array([ 1., 2., 4., 8.], dtype=float32), dense_shape=array([4, 1]))]
ウェットというテナントも存在しています.前の他のcategoricalucolumにはweightは存在しません.ラインナップ
linear_model(
features,
feature_columns,
units=1,
sparse_combiner='sum',
weight_collections=None,
trainable=True
)
すべての特徴に対して線形重み付け動作を行う.def get_linear_model_bias():
with tf.variable_scope('linear_model', reuse=True):
return tf.get_variable('bias_weights')
def get_linear_model_column_var(column):
return tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES,
'linear_model/' + column.name)[0]
def test_linear_model():
"""
:return:
"""
featrues = {
'price': [[1.0], [5.0], [10.0]],
'color': [['R'], ['G'], ['B']]
}
price_column = feature_column.numeric_column('price')
color_column = feature_column.categorical_column_with_vocabulary_list('color',
['R', 'G', 'B'])
prediction = feature_column.linear_model(featrues, [price_column, color_column])
bias = get_linear_model_bias()
price_var = get_linear_model_column_var(price_column)
color_var = get_linear_model_column_var(color_column)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
sess.run(tf.local_variables_initializer())
sess.run(tf.tables_initializer())
sess.run(bias.assign([7.0]))
sess.run(price_var.assign([[10.0]]))
sess.run(color_var.assign([[2.0], [2.0], [2.0]]))
predication_result = sess.run([prediction])
print(predication_result)
test_linear_model()
[array([[ 19.],
[ 59.],
[ 109.]], dtype=float32)]
crosseducolumn組み合わせの特徴は、これはsparserの特徴にのみ適用されます.生成されたのは依然としてsparsorの特徴です.
def test_crossed_column():
"""
crossed column
:return:
"""
featrues = {
'price': [['A', 'A'], ['B', 'D'], ['C', 'A']],
'color': [['R', 'R'], ['G', 'G'], ['B', 'B']]
}
price = feature_column.categorical_column_with_vocabulary_list('price',
['A', 'B', 'C', 'D'])
color = feature_column.categorical_column_with_vocabulary_list('color',
['R', 'G', 'B'])
p_x_c = feature_column.crossed_column([price, color], 16)
p_x_c_identy = feature_column.indicator_column(p_x_c)
p_x_c_identy_dense_tensor = feature_column.input_layer(featrues, [p_x_c_identy])
with tf.Session() as session:
session.run(tf.global_variables_initializer())
session.run(tf.tables_initializer())
print('use input_layer' + '_' * 40)
print(session.run([p_x_c_identy_dense_tensor]))
test_crossed_column()
use input_layer________________________________________
[array([[ 0., 0., 0., 0., 0., 0., 0., 0., 4., 0., 0., 0., 0.,
0., 0., 0.],
[ 0., 0., 0., 0., 2., 0., 0., 0., 0., 2., 0., 0., 0.,
0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 2., 0.,
0., 2., 0.]], dtype=float32)]