2017-06-26 5 views
2

Hej guys 埋め込みを使用して、密集した空間に複数のラベル付きカテゴリデータを投影しようとしています。Tensorflow埋め込みルックアップで不等サイズのリスト

ここにおもちゃの例があります。私が4つのカテゴリを持ち、それらを2次元空間に投影したいとしましょう。

sess = tf.InteractiveSession() 
embeddings = tf.Variable(tf.random_uniform([4, 2], -1.0, 1.0)) 
sess.run(tf.global_variables_initializer()) 
y = tf.nn.embedding_lookup(embeddings, [0,1]) 
y.eval() 

と、このようなものを返す:

array([[ 0.93999457, -0.83051205], 
     [-0.1699729 , 0.73936272]], dtype=float32) 
をさらに私は、コードは次のようになります2つのインスタンス、カテゴリ0に属する第1の1、カテゴリー2番目の1 1.

を得ました

これまでのところ、とても良いです。インスタンスが2つのカテゴリに属しているとします。埋め込みルックアップは、例えば平均で減らすことができる2つのベクトルを返します。

y = tf.nn.embedding_lookup(embeddings, [[0,1],[1,2]]) # two categories 
y_ = tf.reduce_mean(y, axis=1) 
y_.eval() 

これは私も同様に動作します。私の問題は、今私のバッチ内のインスタンスは、カテゴリ例えば、同じ量に属していない場合に生じる:

y = tf.nn.embedding_lookup(embeddings, [[0,1],[1,2,3]]) # unequal sized lists 
y_ = tf.reduce_mean(y, axis=1) 
y_.eval() 

ValueError: Argument must be a dense tensor: [[0, 1], [1, 2, 3]] - got shape [2], but wanted [2, 2]. 

この問題を回避する方法についてのアイデアを?

答えて

0

私はMLのエキスパートから非常に遠いですが、多分次のことができます。カテゴリ2に属するデータポイントを[2]と表すのではなく、[0, 0, 1, 0]とすることができます。つまり、各カテゴリを入力の次元として扱い、そのカテゴリに属する​​インスタンスを表すには0 or 1を使用します。

このような表現は非常に疎であるため、SparseTensorhttps://www.tensorflow.org/api_docs/python/tf/nn/embedding_lookup_sparseを使用できます。ここでその使用例を示しますHow to use tf.nn.embedding_lookup_sparse in TensorFlow?