はい、要点を理解するまで、この関数を理解するのは困難です。
最も単純な形式では、に似てい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]