Cuerdas TensorFlow: qué son y cómo trabajar con ellas

Cuando leo el archivo con tf.read_file obtengo algo con el tipo tf.string . La documentación dice solo que es “Matrices de bytes de longitud variable. Cada elemento de un Tensor es una matriz de bytes”. ( https://www.tensorflow.org/versions/r0.10/resources/dims_types.html ). No tengo idea de cómo interpretar esto.

No puedo hacer nada con este tipo. En Python habitual, puede obtener elementos por índice como my_string[:4] , pero cuando ejecuto el siguiente código, my_string[:4] un error.

 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 

Dice

  Archivo "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/tensor_shape.py", línea 621, en assert_has_rank
     boost ValueError ("La forma% s debe tener rango% d"% (auto, rango))
 ValueError: Shape () debe tener rango 1

Tampoco puedo convertir mi cadena a tf.float32 tensor. Es .flo archivo .flo y tiene un encabezado mágico “PIEH”. Este código numpy convierte exitosamente dicho encabezado en número (vea el ejemplo aquí https://stackoverflow.com/a/28016469/4744283 ) pero no puedo hacer eso con tensorflow. Intenté tf.string_to_number(string, out_type=tf.float32) pero dice

  tensorflow.python.framework.errors.InvalidArgumentError: StringToNumberOp no pudo convertir correctamente la cadena: PIEH

Entonces, ¿qué cuerda es? ¿Qué es la forma? ¿Cómo puedo al menos obtener parte de la cadena? Supongo que si puedo obtener una parte de ella solo puedo omitir la parte “PIEH”.

    UPD : Olvidé decir que tf.slice(string, [0], [4]) tampoco funciona con el mismo error.

    A diferencia de Python, donde una cadena puede tratarse como una lista de caracteres para los fines de tf.string , el tf.string s de TensorFlow es un tf.string indivisible. Por ejemplo, x debajo es un Tensor con forma (2,) cada elemento es una cadena de longitud variable.

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

    Sin embargo, para lograr lo que desea, TensorFlow proporciona el operador tf.decode_raw . Toma un tensor tf.string como entrada, pero puede decodificar la cadena en cualquier otro tipo de datos primitivos. Por ejemplo, para interpretar la cadena como un tensor de caracteres, puede hacer lo siguiente:

     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]