168
tf.nn.embedding_lookup(params, ids, partition_strategy='mod', name=None)

この機能の役割が理解できません。ルックアップテーブルのようなものですか?各 ID (ID 内) に対応するパラメーターを返すことを意味するのはどれですか?

たとえば、skip-gramモデルで を使用するtf.nn.embedding_lookup(embeddings, train_inputs)と、それぞれtrain_inputに対応する埋め込みが見つかりますか?

4

8 に答える 8

229

はい、要点を理解するまで、この関数を理解するのは困難です。

最も単純な形式では、に似ていtf.gatherます。paramsで指定されたインデックスに従っての要素を返しますids

たとえば(あなたが中にいると仮定してtf.InteractiveSession()

params = tf.constant([10,20,30,40])
ids = tf.constant([0,1,2,3])
print tf.nn.embedding_lookup(params,ids).eval()

[10 20 30 40]params の最初の要素 (インデックス 0) は 、params10の 2 番目の要素 (インデックス 1) は20などであるため、を返します。

同様に、

params = tf.constant([10,20,30,40])
ids = tf.constant([1,1,3])
print tf.nn.embedding_lookup(params,ids).eval()

戻り[20 20 40]ます。

しかしembedding_lookup、それ以上です。params引数は、単一のテンソルではなく、テンソルのリストにすることができます。

params1 = tf.constant([1,2])
params2 = tf.constant([10,20])
ids = tf.constant([2,0,2,1,2,3])
result = tf.nn.embedding_lookup([params1, params2], ids)

このような場合、 で指定されたインデックスは、パーティション戦略idsに従ってテンソルの要素に対応します。ここで、デフォルトのパーティション戦略は 'mod' です。

「mod」戦略では、インデックス 0 はリストの最初のテンソルの最初の要素に対応します。インデックス 1は、 2 番目のテンソルの最初の要素に対応します。インデックス 2は3 番目のテンソルの最初の要素に対応し、以下同様です。params がテンソルのリストであると仮定すると、すべての index に対して、単純に indexが (i+1) 番目の tensor の最初の要素に対応します。i0..(n-1)n

現在、リストにはテンソルのみが含まれているため、インデックスnはテンソル n+1 に対応できません。したがって、indexは最初のテンソルの2 番目の要素に対応します。同様に、indexは 2 番目のテンソルの 2 番目の要素に対応します。paramsnnn+1

したがって、コードでは

params1 = tf.constant([1,2])
params2 = tf.constant([10,20])
ids = tf.constant([2,0,2,1,2,3])
result = tf.nn.embedding_lookup([params1, params2], ids)

インデックス 0 は、最初のテンソルの最初の要素に対応します: 1

インデックス 1 は、2 番目のテンソルの最初の要素に対応します: 10

インデックス 2 は、最初のテンソルの 2 番目の要素に対応します: 2

インデックス 3 は、2 番目のテンソルの 2 番目の要素に対応します: 20

したがって、結果は次のようになります。

[ 2  1  2 10  2 20]
于 2017-01-29T16:03:01.607 に答える
150

embedding_lookupparams関数はテンソルの行を取得します。この動作は、numpy の配列でインデックスを使用する場合と似ています。例えば

matrix = np.random.random([1024, 64])  # 64-dimensional embeddings
ids = np.array([0, 5, 17, 33])
print matrix[ids]  # prints a matrix of shape [4, 64] 

params引数はテンソルのリストにすることもできます。その場合、idsはテンソル間で分散されます。たとえば、3 つの tensor のリストが与えられた場合[2, 64]、デフォルトの動作は、それらがids: [0, 3][1, 4]、を表すこと[2, 5]です。

partition_strategyidsがリスト間でどのように配布されるかを制御します。パーティショニングは、マトリックスが大きすぎて 1 つのピースに保持できない場合に、大規模な問題に役立ちます。

于 2016-01-19T13:05:06.647 に答える
18

これは、ルックアップを埋め込むプロセスを描いた画像です。

画像: 検索プロセスの埋め込み

簡潔に言うと、ID のリストで指定された埋め込みレイヤーの対応する行を取得し、それをテンソルとして提供します。これは、次のプロセスを経て達成されます。

  1. プレースホルダーを定義するlookup_ids = tf.placeholder([10])
  2. 埋め込み層を定義するembeddings = tf.Variable([100,10],...)
  3. テンソルフロー操作を定義するembed_lookup = tf.embedding_lookup(embeddings, lookup_ids)
  4. 実行して結果を取得するlookup = session.run(embed_lookup, feed_dict={lookup_ids:[95,4,14]})
于 2018-08-05T11:46:33.763 に答える