Строки 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]