2016-11-10 2 views
0

Рассмотрим такой код:Странный вывод embedding_lookup_sparse

w = tf.Variable(tf.constant([[1., 2], [3, 4], [5, 6], [7, 8]])) 
sess = tf.Session() 
sess.run(tf.initialize_all_variables()) 

st = tf.SparseTensor([[0, 0, 0], 
         [0, 1, 1], 
         [1, 0, 0], 
         [1, 1, 0], 
         [2, 0, 0], 
         [2, 1, 0]], [0, 2, 0, 1, 1, 3], [3, 3, 2]) 

sess.run(tf.nn.embedding_lookup_sparse(w, st, None, combiner='sum')) 

Выход:

array([[ 6., 8.], 
     [ 4., 6.], 
     [ 10., 12.]], dtype=float32) 

В соответствии с documentation форма выхода должно быть [3, 3, 3], так как форма (SP_ID) = [3, 3, 2] и форма (w) = [4, 3], но это не так :(

Может кто-нибудь объяснить, почему он работает таким образом? Потому что я ожидал поведения простого embedding_lookup, но с агрегация по последним осям.

EDIT

Для каждого объекта у меня есть 2 функции и каждый представляет собой одно слово, так что я хочу представить каждый объект с двумя Concat вложениями, я могу сделать это:

sess.run(tf.reshape(tf.nn.embedding_lookup(w, [[0, 1], [2, 3]]), shape=(2, 4))) 

Выход

array([[ 1., 2., 3., 4.], 
     [ 5., 6., 7., 8.]], dtype=float32) 

Итак, теперь у меня все еще есть 2 функции, но каждый может быть представлен несколькими словами, и я хочу объединить вложения для слов, соответствующих одной функции. Похоже, что embedding_lookup_sparse должен работать таким образом, но я не понимаю, почему мой код не работает.

Спасибо!

+0

Каков ожидаемый выход во втором случае? – drpng

+0

Я ожидаю, что [[[1, 2], [3, 4]], [[1, 2], [1, 2]], [[1, 2], [1, 2]]] ' –

ответ

0

При использовании поиска, вы получите тензор, который имеет размер вектора вложения, поэтому выход внутреннего размер должен быть 2. Например, если вы использовали: w = tf.Variable(tf.constant( [[1., 2, 0.1, 0.2], [3, 4, 0.3, 0.4], [5, 6, 0.5, 0.6], [7, 8, 0.7, 0.8]])) тогда вы получите выход с 4 внутренними столбцами.

+0

Не нужно, см. Редактирование. –

Смежные вопросы