Строки TensorFlow: что они такое и как с ними работать
когда я читаю файл с tf.read_file
Я получаю что-то типа tf.string
. В документации говорится только, что это " байтовые массивы переменной длины. Каждый элемент тензора представляет собой массив байтов.(https://www.tensorflow.org/versions/r0.10/resources/dims_types.html). Я понятия не имею, как это интерпретировать.
Я ничего не могу сделать с этим типом. В обычном python вы можете получить элементы по индексу, например my_string[:4]
, но когда я запускаю следующий код я получаю ошибка.
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
он говорит:
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/tensor_shape.py", line 621, in assert_has_rank raise ValueError("Shape %s must have rank %d" % (self, rank)) ValueError: Shape () must have rank 1
также я не могу преобразовать свою строку в tf.float32
тензор. Это .flo
файл и имеет магический заголовок "PIEH". Этот код numpy успешно преобразует такой заголовок в число (см. пример здесь https://stackoverflow.com/a/28016469/4744283) но я не могу сделать это с tensorflow. Я пытался!--8--> но он говорит
tensorflow.python.framework.errors.InvalidArgumentError: StringToNumberOp could not correctly convert string: PIEH
Итак, какая строка? Что это за форма? Как я могу получить хотя бы часть веревки? Я полагаю, что если я могу получить часть этого, я могу просто пропустить часть "PIEH".
UPD: я забыл сказать, что tf.slice(string, [0], [4])
также не работает с той же ошибкой.
1 ответов
в отличие от Python, где строка может рассматриваться как список символов для нарезки и таких, Tensorflow's tf.string
s являются неделимыми значениями. Например, x
ниже Tensor
С (2,)
каждый элемент которого является строкой переменной длины.
x = tf.constant(["This is a string", "This is another string"])
однако, чтобы достичь того, что вы хотите, TensorFlow предоставляет tf.decode_raw
оператора. Это занимает tf.string
тензора в качестве входных данных, но может декодировать строку в любой другой примитивный тип данных. Например, интерпретировать строку как тензор символов можно следующим образом:
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]