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