はい、要点を理解するまで、この関数を理解するのは困難です。
最も単純な形式では、に似てい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 の最初の要素に対応します。i
0..(n-1)
n
現在、リストにはテンソルのみが含まれているため、インデックスn
はテンソル n+1 に対応できません。したがって、indexは最初のテンソルの2 番目の要素に対応します。同様に、indexは 2 番目のテンソルの 2 番目の要素に対応します。params
n
n
n+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]