2

私は投稿タグのような機能を持っています。だから、各観測のためにpost_tag機能は "oscars、brad-pitt、award"のようなタグの選択であるかもしれません。私は、Googleのクラウドマシンの学習を実行している推定子APIを使用してテンソルフローモデルビルドに機能として渡すことができるようにしたいと考えています(this example)。tensoflowでのマルチホンエンコーディング(Google Cloud Machine Learning、tf estimator api)

これをテンソルフローのマルチホットエンコード機能に変換する方法がわかりません。理想的にはsklearnのMultiLabelBinarizerに似たものを手に入れようとしています。

私はthisは関連性がありますが、私が必要とするものではないと思います。

だから私のようなデータを持っていると言う:私が持っている場合は

更新

id,post_tag_oscars,post_tag_brad_pitt,post_tag_awards,post_tag_film,post_tag_reviews,post_tag_matt_damon,post_tag_bourne 
1,1,1,1,0,0,0,0 
2,1,0,0,1,1,0,0 
3,0,0,0,0,0,1,1 

:として、tensorflow内の前処理の一部として、私はそれをフィーチャーしたい

id,post_tag 
1,[oscars,brad-pitt,awards] 
2,[oscars,film,reviews] 
3,[matt-damon,bourne] 

をpost_tag_listは、入力csvの "oscars、brad-pitt、award"のような文字列です。そして、私はそれからしようとした場合:

INPUT_COLUMNS = [ 
... 
tf.contrib.lookup.HashTable(tf.contrib.lookup.KeyValueTensorInitializer('post_tag_list', 
              tf.range(0, 10, dtype=tf.int64), 
              tf.string, tf.int64), 
          default_value=10, name='post_tag_list'), 
...] 

私はこのエラーを取得する:

Traceback (most recent call last): 
    File "/usr/lib/python2.7/runpy.py", line 174, in _run_module_as_main 
    "__main__", fname, loader, pkg_name) 
    File "/usr/lib/python2.7/runpy.py", line 72, in _run_code 
    exec code in run_globals 
    File "/home/andrew_maguire/localDev/codeBase/pmc-analytical-data-mart/clickmodel/trainer/task.py", line 4, in <module> 
    import model 
    File "trainer/model.py", line 49, in <module> 
    default_value=10, name='post_tag_list'), 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/lookup_ops.py", line 276, in __init__ 
    super(HashTable, self).__init__(table_ref, default_value, initializer) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/lookup_ops.py", line 162, in __init__ 
    self._init = initializer.initialize(self) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/lookup_ops.py", line 348, in initialize 
    table.table_ref, self._keys, self._values, name=scope) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/gen_lookup_ops.py", line 205, in _initialize_table_v2 
    values=values, name=name) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/op_def_library.py", line 767, in apply_op 
    op_def=op_def) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 2632, in create_op 
    set_shapes_for_outputs(ret) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 1911, in set_shapes_for_outputs 
    shapes = shape_func(op) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 1861, in call_with_requiring 
    return call_cpp_shape_fn(op, require_shape_fn=True) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/common_shapes.py", line 595, in call_cpp_shape_fn 
    require_shape_fn) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/common_shapes.py", line 659, in _call_cpp_shape_fn_impl 
    raise ValueError(err.message) 
ValueError: Shape must be rank 1 but is rank 0 for 'key_value_init' (op: 'InitializeTableV2') with input shapes: [], [], [10]. 

私は他の「オスカー、ブラッド・ピット、賞、その他、その他、のようになりパッドに各post_tag_listだった場合、OTHER、OTHER、OTHER、OTHER "ですので、常に10の長さです。それがここでの潜在的な解決策だろうか。

また、私がここで渡すかもしれないすべての投稿タグのサイズを知っている必要がありますか(まったく新しいものとして定義されています)。

+0

すべてのタグセットのカーディナリティとは何ですか? – rhaertel80

+1

実際には公開されています。誰かが投稿を作成すると、既存のものを見つけることができない場合、新しいタグを作ることもできます。これまでのところ約7kで、新しいタグをつけないように奨励しようとしていますが、新しいニュースの話が新しいものについて新しいタグが付けられるかどうかは分かりません。実際には、タグを投稿タイトルに似た単語として扱い、埋め込みスペースに入れる方が適切かもしれません。私は、タグと投稿についてdoc2vecを訓練し、密集した特徴としてそれらのベクトルを渡すつもりです。ワイドコラムに使うためにタグのダミーがあることを望んでいました。 – andrewm4894

+1

これまでに目に見えなかったタグは、1つ以上の「見えない」重みベクトルにマッピングされます。 7Kは私が探していたものです。 – rhaertel80

答えて

1

tf.contrib.lookup.Hashtableを試しましたか?ここで

は、私自身の使用の使用例である:私は、ルックアップは、通常のテンソルとSparseTensorsの両方のために働くと考えている

import tensorflow as tf 
session = tf.InteractiveSession() 

entries = ['red', 'blue', 'green'] 
table = tf.contrib.lookup.HashTable(
    tf.contrib.lookup.KeyValueTensorInitializer(entries, 
               tf.range(0, len(entries), dtype=tf.int64), 
               tf.string, tf.int64), 
    default_value=len(entries), name='entries') 
tf.tables_initializer().run() 

value = tf.constant([['blue', 'red'], ['green', 'red']]) 
print(table.lookup(value).eval()) 

(あなたは後者で終わるかもしれない:https://github.com/TensorLab/tensorfx/blob/master/src/data/_transforms.py#L160と構成された例それに基づいてスニペットあなたの可変長の値のリストを与えて)。

+0

素晴らしい - 私が必要とするものとまったく同じように見えます。あなたの例のように実際に「赤|青|緑」のように見えるcsvで文字列を取得する方法を知るためにちょっと遊んでみるだけです。 'post_tags = post_tag_list.split(" | ")'のようなものを考えて、 'INPUT_COLUMNS = [ ... tf.contrib.lookup.KeyValueTensorInitializer( 'post_tags'、 tf.range(0、len) (post_tags)、DTYPE = tf.int64)、 tf.string、tf.int64)、 最後... ] ' – andrewm4894

+0

ぐふ..'トレースバック(最新のコール): ファイル「は/ usr/libに/ python2 .run_module_as_mainの.7/runpy.py "行174、 " __main__ "、fname、loader、pkg_name) ファイル" /usr/lib/python2.7/runpy.py "、行72、_run_code の実行コードrun_globals 012に4行目の "/home/andrew_maguire/localDev/codeBase/pmc-analytical-data-mart/clickmodel/trainer/task.py"ファイル 輸入モデル ファイル "トレーナー/ model.py"、ライン32は、 post_tagsに= post_tag_list.split( "|") NameError:名 'post_tag_listは' – andrewm4894

+0

をdefined'されていない私が行うことができるかどうかわかりませんINPUT_COLUMNSを定義する際に.split( "|")を使用します。しかし、あなたの例のエンティティごとにリストのように終わるように、[post_tag_list]フィールド( "red | green | blue"のように見える)をどのタイプで読み込むのかはよくわからないので、hashtable() – andrewm4894

1

ここにはいくつかの問題があります。まず、成長し続けるタグセットに関する質問です。 CSVから可変長データを解析する方法も知りたいです。

増加するタグセットを処理するには、OOVまたは機能ハッシュを使用する必要があります。 Nikhilは後者を示したので、私は前者を示します。のは、可変長データを持つ列を使用しているとしましょうCSV

から可変長データを解析する方法

|例えばセパレータとして使用することができる。

csv = [ 
    "1,oscars|brad-pitt|awards", 
    "2,oscars|film|reviews", 
    "3,matt-damon|bourne", 
] 

このようなコードを使用すると、SparseTensorに変換できます。

import tensorflow as tf 

# Purposefully omitting "bourne" to demonstrate OOV mappings. 
TAG_SET = ["oscars", "brad-pitt", "awards", "film", "reviews", "matt-damon"] 
NUM_OOV = 1 

def sparse_from_csv(csv): 
    ids, post_tags_str = tf.decode_csv(csv, [[-1], [""]]) 
    table = tf.contrib.lookup.index_table_from_tensor(
     mapping=TAG_SET, num_oov_buckets=NUM_OOV, default_value=-1) 
    split_tags = tf.string_split(post_tags_str, "|") 
    return ids, tf.SparseTensor(
     indices=split_tags.indices, 
     values=table.lookup(split_tags.values), 
     dense_shape=split_tags.dense_shape) 

# Optionally create an embedding for this. 
TAG_EMBEDDING_DIM = 3 

ids, tags = sparse_from_csv(csv) 

embedding_params = tf.Variable(tf.truncated_normal([len(TAG_SET) + NUM_OOV, TAG_EMBEDDING_DIM])) 
embedded_tags = tf.nn.embedding_lookup_sparse(embedding_params, sp_ids=tags, sp_weights=None) 

# Test it out 
with tf.Session() as s: 
    s.run([tf.global_variables_initializer(), tf.tables_initializer()]) 
    print(s.run([ids, embedded_tags])) 

あなたがそうのような出力が表示されます(埋め込みがランダムであるため、正確な数は変化します):

[array([1, 2, 3], dtype=int32), array([[ 0.16852427, 0.26074541, -0.4237918 ], 
     [-0.38550434, 0.32314634, 0.858069 ], 
     [ 0.19339906, -0.24429649, -0.08393878]], dtype=float32)] 

あなたはCSVの各列はndarray、として表現されていることがわかりますタグは3次元埋め込みです。

+0

ありがとうございます - これは非常に便利です。私がどのように乗り込んでいるかをあなたに教えてみましょう。 – andrewm4894

関連する問題