2016-08-29 2 views
3

Wir haben versucht mit tf.nn.embedding_lookup und es funktioniert. Aber es braucht dichte Eingabedaten und jetzt brauchen wir tf.nn.embedding_lookup_sparse für sparse Eingabe.Wie tf.nn.embedding_lookup_sparse in TensorFlow zu verwenden?

Ich habe den folgenden Code geschrieben, aber einige Fehler bekommen.

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)) 

Das Fehlerprotokoll sieht so aus.

enter image description here

Jetzt habe ich keine Ahnung, wie diese Methode richtig fixieren und zu verwenden. Jeder Kommentar könnte geschätzt werden.

Nach dem Tauchen in safe_embedding_lookup_sparse ‚s Unit-Test, bin ich mehr verwirrt, warum ich dieses Ergebnis bekam, wenn die spärlichen Gewicht geben, vor allem, warum wir so etwas wie embedding_weights[0][3] bekamen, wo 3 wird in dem obigen Code nicht erschienen.

enter image description here

+0

Bitte, lassen Sie mich wissen, ob meine Antwort Ihr Problem :) – rvinas

+0

@rvinas Dank gelöst. Ich finde es noch nicht heraus, nachdem ich den 'safe_embbedding_lookup_sparse' Unit Test gelesen habe. Ich habe die Frage aktualisiert und möchten Sie den Code für uns erklären? – tobe

+0

Könnten Sie bitte den Rohcode angeben? – rvinas

Antwort

6

tf.nn.embedding_lookup_sparse() verwendet Segmentation Einbettungen zu kombinieren, die Indizes von SparseTensor erfordert bei 0 und zu steigen um 1 zu starten, ist, warum Sie diesen Fehler erhalten.

Anstatt boolescher Werte muss Ihr spärlicher Tensor nur die Indizes jeder Zeile enthalten, die Sie aus Einbettungen abrufen möchten. Hier ist Ihr gezwickt Code:

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.] 

Außerdem können Sie Indizes von tf.SparseTensor() verwenden, um Wort Einbettungen Mithilfe der erlaubt tf.nn.embedding_lookup_sparse() Combiner zu kombinieren:

  • „Summe“ berechnet die gewichtete Summe der Einbetten von Ergebnissen für jede Zeile.
  • "Mittelwert" ist die gewichtete Summe geteilt durch das Gesamtgewicht.
  • "sqrtn" ist die gewichtete Summe geteilt durch die Quadratwurzel der Summe der Quadrate der Gewichte.

Zum Beispiel:

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.] 
Verwandte Themen