Строки 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.strings являются неделимыми значениями. Например, 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]