问题 TensorFlow字符串:它们是什么以及如何使用它们


当我用文件阅读时 tf.read_file 我得到了类型的东西 tf.string。文档只说它是“可变长度字节数组.Tensor的每个元素都是一个字节数组。” (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

它说

  在assert_has_rank中输入文件“/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/tensor_shape.py”,第621行
    提高ValueError(“Shape%s必须具有等级%d”%(自我,等级))
ValueError:Shape()必须具有等级1

我也无法将我的字符串转换为 tf.float32 张量。它是 .flo 文件,它有魔术标题“PIEH”。这个numpy代码成功地将这个标题转换为数字(参见此处的示例) https://stackoverflow.com/a/28016469/4744283但是我不能用张量流来做到这一点。我试过了 tf.string_to_number(string, out_type=tf.float32) 但它说

tensorflow.python.framework.errors.InvalidArgumentError:StringToNumberOp无法正确转换字符串:PIEH

那么,字符串是什么?它的形状是什么?我怎么能至少得到一部分字符串?我想如果我可以参与其中,我可以跳过“PIEH”部分。

UPD:我忘了这么说 tf.slice(string, [0], [4]) 也不能使用相同的错误。


2525
2017-08-11 17:14


起源

顺便说一下,你可以使用这个脚本获得一个接受tf.string数据类型的操作列表: gist.github.com/yaroslavvb/16bb81fcfb0932169087add47ecb8c3a - Yaroslav Bulatov
谢谢你的回答!这个脚本是特定版本的TF吗?它至少不适用于0.9。将尝试更新到0.10。 - ckorzhik
不,它对0.10也不起作用 $ python list_ops.py Traceback (most recent call last): File "list_ops.py", line 23, in <module> if arg.type == tf.string: File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/dtypes.py", line 244, in __eq__ and self._type_enum == as_dtype(other).as_datatype_enum) File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/dtypes.py", line 532, in as_dtype if key == type_value: TypeError: data type not understood   你能帮我解决一下吗? - ckorzhik
好像我已经修好了:) 23行必须 if arg.type == tf.string.as_datatype_enum: - ckorzhik
我怀疑你使用的是0.9版本或更早版本的TensorFlow,dtypes.py中没有这样的行,自0.10版本发布以来它一直未被触及 - Yaroslav Bulatov


答案:


与Python不同,其中字符串可以被视为用于切片等的字符列表,TensorFlow的 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]

12
2017-08-11 17:44



谢谢。那么,它们是标量还是其他什么? - ckorzhik
它们是本机字符串类型。您可以使用将其分解为字符(长度为1个字符串) tf.string_split(s, delimiter="") 在最新版本 - Yaroslav Bulatov
print("".join(map(chr, y.eval()))) 更有可能是你想要的 - Mr_and_Mrs_D