2017-06-27 25 views
6

Próbuję pobrać znaki w tensorze ciągu, aby przewidzieć poziom postaci. Podstawowymi prawdami są słowa, w których każdy znak ma id w słowniku. Mam tensor odpowiadający długości struny.Tensorflow - Odzyskiwanie każdego znaku w tensorze ciągów znaków

Teraz muszę pobrać każdy znak w tensorze ciągu. Po sprawdzeniu pokrewnych postów, proste pobieranie może wyglądać następująco. Przykład ciąg jest „To”

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

Teraz chcę zrobić łańcuch z przestrzeni pomiędzy literami „To” tj „T h i s”. Potrzebuję odstępów na początku i na końcu. Jak to zrobić?

Próbowałem iterację bohaterów jak poniżej

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

Ale pętla liczy liczbę całkowitą zamiast tensora.

Każdy pomysł na wykonanie powyższych zadań? Nie mogłem znaleźć żadnej dokumentacji związanej z tym (oprócz funkcji tf.string_split). Wszelkie sugestie są mile widziane. Dzięki

Odpowiedz

5

Twoim problemem jest to, że próbujesz iterować nad Tensor, który nie jest możliwy do sprawdzenia. Istnieje kilka alternatyw dla tego zadania, na przykład przekonwertowanie ich na macierz numpy za pomocą lub użycie tf.map_fn.

Jeśli chcesz zagrożenie b jak numpy array wystarczy dodać wywołanie .eval() przed .values i iteracyjne nad wyniku następująco:

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) 

Drugą alternatywą jest bardziej odpowiednie ze względu na to wykorzystuje TensorFlow użytkownika wykres. Opiera się na wykorzystaniu funkcji, która "odwzorowuje" Tensor. Można to zrobić w następujący sposób (w fn gdzie można zdefiniować de zachowanie iteracji):

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

Właściwie mój problem nie jest iteracyjne nad tensora raczej dostać każdy znak. Nie mogę użyć eval() tutaj, ponieważ potrzebuję znaków w postaci tensorów. Moim głównym zadaniem jest uzyskanie tensora napisowego z wstawionymi odstępami między oryginalnym ciągiem znaków. Moim pomysłem jest dodanie naprzemiennie każdego naprężenia ze spacjami, aby uzyskać pożądany tensor. Ale nie jestem pewien, jak to zrobić. –

+1

Zadanie jest łatwe z drugim podejściem. Możesz to zrobić w następujący sposób: 'tf.string_split (tf.map_fn (lambda i: i +" ", b), delimiter =" ").", Co oznacza, że ​​dodajesz spację na końcu każdej litery, a następnie ponownie -wyświetli wynikowy tensor. – garciparedes

+0

Działa jak urok. Dziękuję Ci –