Строки 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-код успешно преобразует такой заголовок в число (см. Пример здесь qaru.site/info/558426/...), но я не могу сделать это с помощью метода tensorflow. Я пробовал tf.string_to_number(string, out_type=tf.float32)
, но он говорит
tensorflow.python.framework.errors.InvalidArgumentError: StringToNumberOp could not correctly convert string: PIEH
Итак, какая строка? Что это за форма? Как я могу хотя бы получить часть строки? Я полагаю, что, если я смогу получить часть этого, я могу просто пропустить часть "PIEH".
UPD. Я забыл сказать, что tf.slice(string, [0], [4])
также не работает с той же ошибкой.
Ответы
Ответ 1
В отличие от Python, где строка может рассматриваться как список символов для целей нарезки и т.д., TensorFlow tf.string
являются неделимыми значениями. Например, 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]