2017-06-27 3 views
6

Ich versuche, die Zeichen in einem String-Tensor für Zeichenebene Vorhersage abrufen. Die Grundwahrheiten sind Wörter, bei denen jedes Zeichen eine ID im Wörterbuch hat. Ich habe einen Tensor, der der Länge der Saite entspricht.Tensorflow - Abrufen jedes Zeichen in einem String-Tensor

Jetzt muss ich jedes Zeichen im String-Tensor bekommen. Nach dem Überprüfen der zugehörigen Posts kann ein einfacher Abruf wie folgt erfolgen. Beispiel Zeichenfolge „Dieses“

a= tf.constant("This",shape=[1]) 
b=tf.string_split(a,delimiter="").values #Sparse tensor has the values array which stores characters 

Jetzt habe ich eine Zeichenfolge mit Leerzeichen zwischen den Buchstaben „Dieses“ heißt „T h i s“ machen wollen. Ich brauche Abstand am Anfang und am Ende. Wie mache ich das?

Ich habe versucht, wie eher unter

for i in xrange(b.dense_shape[1]): # b.dense_shape[1] has the length of string 
     x=b.values[i] 

Aber die Schleife erwartet eine ganze Zahl durch die Zeichen zu durchlaufen als ein Tensor.

Haben Sie eine Idee, wie Sie die oben genannten Aufgaben erledigen können? Ich konnte keine Dokumentation dazu finden (abgesehen von der Funktion tf.string_split). Irgendwelche Vorschläge sind willkommen. Danke

Antwort

5

Ihr Problem ist, dass Sie versuchen, über Tensor zu iterieren, das ist nicht iterable. Es gibt einige Alternativen für diese Aufgabe, z. B. konvertieren Sie es in numpy Array mit eval() oder verwenden Sie die tf.map_fn.

Wenn Sie wollen Bedrohung b als numpy array Sie nur den Anruf .eval() vor .values und iterieren das Ergebnis hinzufügen müssen, wie folgt:

with tf.Session() as sess: 
    a = tf.constant("This", shape=[1]) 
    b = tf.string_split(a, delimiter="").values.eval() 

    for i in b: 
     print(i) 

Die zweite Alternative, weil es ist besser geeignet nutzt TensorFlow des Graph. Es basiert auf der Verwendung einer Funktion, die den Tensor "mappt". Dies kann wie folgt (wobei in fn Sie de Verhalten der Iteration definieren können):

with tf.Session() as sess: 
    a = tf.constant("This", shape=[1]) 
    b = tf.string_split(a, delimiter="").values 

    fn = lambda i: i 

    print(tf.map_fn(fn, b).eval()) 
+0

Eigentlich mein Problem ist nicht über den Tensor laufen, sondern jedes Zeichen erhalten. Ich kann eval() hier nicht verwenden, da ich die Zeichen in Form von Tensoren brauche. Meine Hauptaufgabe besteht darin, einen Stringtensor mit eingefügten Leerzeichen zwischen der ursprünglichen Zeichenfolge zu erhalten. Meine Idee ist es, jeden Zeichenstensor mit Leerzeichen zu versehen, um den gewünschten Stringtensor zu erhalten. Aber ich bin mir nicht sicher, wie ich das machen soll. –

+1

Die Aufgabe ist mit dem zweiten Ansatz einfach. Sie können dies folgendermaßen tun: 'tf.string_split (tf.map_fn (lambda i: i +" ", b), Begrenzer =" "). Values' bedeutet, dass Sie am Ende jedes Zeichens ein Leerzeichen hinzufügen und dann re -split den resultierenden Tensor. – garciparedes

+0

Funktioniert wie ein Charme. Vielen Dank –

Verwandte Themen