web-dev-qa-db-fra.com

Chaînes TensorFlow: ce qu'elles sont et comment les utiliser

Lorsque je lis un fichier avec tf.read_file, J'obtiens quelque chose avec le type tf.string. La documentation indique seulement qu'il s'agit de "tableaux d'octets de longueur variable. Chaque élément d'un tenseur est un tableau d'octets". ( https://www.tensorflow.org/versions/r0.10/resources/dims_types.html ). Je ne sais pas comment interpréter cela.

Je ne peux rien faire avec ce type. En d'habitude python vous pouvez obtenir des éléments par index comme my_string[:4], Mais lorsque j'exécute le code suivant, j'obtiens une erreur.

import tensorflow as tf
import numpy as np

x = tf.constant("This is string")
y = x[:4]


init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)
result = sess.run(y)
print result

Ça dit

  Fichier "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/tensor_shape.py", ligne 621, dans assert_has_rank 
 Augmenter ValueError ("La forme% s doit avoir le rang% d "% (self, rank)) 
 ValueError: Shape () doit avoir le rang 1 

Je ne peux pas non plus convertir ma chaîne au tenseur tf.float32. C'est un fichier .flo Et il a un en-tête magique "PIEH". Ce code numpy a réussi à convertir un tel en-tête en nombre (voir l'exemple ici https://stackoverflow.com/a/28016469/474428 ) mais je ne peux pas le faire avec tensorflow. J'ai essayé tf.string_to_number(string, out_type=tf.float32) mais ça dit

tensorflow.python.framework.errors.InvalidArgumentError: StringToNumberOp n'a pas pu convertir correctement la chaîne: PIEH 

Alors, quelle chaîne est-ce? Quelle est sa forme? Comment puis-je au moins obtenir une partie de la chaîne? Je suppose que si je peux en obtenir une partie, je peux simplement sauter la partie "PIEH".

[~ # ~] upd [~ # ~] : J'ai oublié de dire que tf.slice(string, [0], [4]) ne fonctionne pas non plus avec la même erreur .

13
ckorzhik

Contrairement à Python, où une chaîne peut être traitée comme une liste de caractères à des fins de découpage et autres, TensorFlow's tf.strings sont des valeurs indivisibles. Par exemple, x ci-dessous est un Tensor de forme (2,) dont chaque élément est une chaîne de longueur variable.

x = tf.constant(["This is a string", "This is another string"])

Cependant, pour réaliser ce que vous voulez, TensorFlow fournit le tf.decode_raw opérateur. Il faut un tf.string tenseur en entrée, mais peut décoder la chaîne en tout autre type de données primitif. Par exemple, pour interpréter la chaîne comme un tenseur de caractères, vous pouvez effectuer les opérations suivantes:

x = tf.constant("This is string")
x = tf.decode_raw(x, tf.uint8)
y = x[:4]
sess = tf.InteractiveSession()
print(y.eval())
# prints [ 84 104 105 115]
16
keveman