2016-08-29 3 views
3

Мы попытались использовать tf.nn.embedding_lookup, и он работает. Но для этого нужны плотные входные данные, и теперь нам нужен tf.nn.embedding_lookup_sparse для разреженного ввода.Как использовать tf.nn.embedding_lookup_sparse в TensorFlow?

Я написал следующий код, но получаю некоторые ошибки.

import tensorflow as tf 
import numpy as np 

example1 = tf.SparseTensor(indices=[[4], [7]], values=[1, 1], shape=[10]) 
example2 = tf.SparseTensor(indices=[[3], [6], [9]], values=[1, 1, 1], shape=[10]) 

vocabulary_size = 10 
embedding_size = 1 
var = np.array([0.0, 1.0, 4.0, 9.0, 16.0, 25.0, 36.0, 49.0, 64.0, 81.0]) 
#embeddings = tf.Variable(tf.ones([vocabulary_size, embedding_size])) 
embeddings = tf.Variable(var) 

embed = tf.nn.embedding_lookup_sparse(embeddings, example2, None) 

with tf.Session() as sess: 
    sess.run(tf.initialize_all_variables()) 

    print(sess.run(embed)) 

Журнал ошибок выглядит следующим образом.

enter image description here

Теперь я понятия не имею, как устанавливать и использовать этот метод правильно. Любые комментарии могут быть оценены.

После погружения в единичном испытание safe_embedding_lookup_sparse «s, я более смущен, почему я получил этот результат, если давать разреженный вес, особенно, почему мы получили что-то вроде embedding_weights[0][3] где 3 не появились в коде выше.

enter image description here

+0

Пожалуйста, дайте мне знать, если мой ответ решил проблему :) – rvinas

+0

Благодарности @rvinas. Я еще не понял это после прочтения модульного теста safe_embedding_lookup_sparse'. Я обновил вопрос и хотел бы вы объяснить нам код? – tobe

+0

Пожалуйста, не могли бы вы предоставить необработанный код? – rvinas

ответ

6

tf.nn.embedding_lookup_sparse() использует Segmentation для объединения вложений, что требует индексов от SparseTensor начать с 0 и увеличиваться на 1. Вот почему вы получите эту ошибку.

Вместо булевых значений ваш разреженный тензор должен содержать только индексы каждой строки, которую вы хотите извлечь из вложений. Вот ваш подправили код:

import tensorflow as tf 
import numpy as np 

example = tf.SparseTensor(indices=[[0], [1], [2]], values=[3, 6, 9], dense_shape=[3]) 

vocabulary_size = 10 
embedding_size = 1 
var = np.array([0.0, 1.0, 4.0, 9.0, 16.0, 25.0, 36.0, 49.0, 64.0, 81.0]) 
embeddings = tf.Variable(var) 

embed = tf.nn.embedding_lookup_sparse(embeddings, example, None) 

with tf.Session() as sess: 
    sess.run(tf.initialize_all_variables()) 
    print(sess.run(embed)) # prints [ 9. 36. 81.] 

Кроме того, вы можете использовать индексы от tf.SparseTensor() объединить вложение слов, используя один из разрешенных tf.nn.embedding_lookup_sparse() комбайнеров:

  • «сумма» вычисляет взвешенную сумму результаты внедрения для каждой строки.
  • «mean» - взвешенная сумма, деленная на общий вес.
  • «sqrtn» представляет собой взвешенную сумму, деленную на квадратный корень из суммы квадратов весов.

Например:

example = tf.SparseTensor(indices=[[0], [0]], values=[1, 2], dense_shape=[2]) 
... 
embed = tf.nn.embedding_lookup_sparse(embeddings, example, None, combiner='sum') 
... 
print(sess.run(embed)) # prints [ 5.] 

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

  • Нет связанных вопросов^_^