TensorFlow 字符串:它们是什么以及如何使用它们
TensorFlow strings: what they are and how to work with them
当我使用 tf.read_file
读取文件时,我得到了类型为 tf.string
的内容。文档只说它是 "Variable length byte arrays. Each element of a Tensor is a byte array." (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
个文件,它具有神奇的 header "PIEH"。这个 numpy 代码成功地将 header 转换为数字(参见此处的示例 ),但我不能用 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])
也不会出现同样的错误。
与 Python 不同,其中一个字符串可以被视为用于切片等目的的字符列表,TensorFlow 的 tf.string
是不可分割的值。例如,下面的 x
是一个形状为 (2,)
的 Tensor
,它的每个元素都是一个可变长度的字符串。
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]
当我使用 tf.read_file
读取文件时,我得到了类型为 tf.string
的内容。文档只说它是 "Variable length byte arrays. Each element of a Tensor is a byte array." (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
个文件,它具有神奇的 header "PIEH"。这个 numpy 代码成功地将 header 转换为数字(参见此处的示例 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])
也不会出现同样的错误。
与 Python 不同,其中一个字符串可以被视为用于切片等目的的字符列表,TensorFlow 的 tf.string
是不可分割的值。例如,下面的 x
是一个形状为 (2,)
的 Tensor
,它的每个元素都是一个可变长度的字符串。
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]