在TensorFlow中合并字符串张量

时间:2015-12-13 02:26:17

标签: python string concatenation tensorflow

我处理了大量dtype="str"数据。我一直在尝试像https://www.tensorflow.org/versions/master/api_docs/python/train.html#SummaryWriter中那样构建一个简单的图形。

对于一个简单的操作,我想使用placeholder将字符串连接在一起,如(How to feed a placeholder?

有谁知道如何将字符串张量合并在一起?

import tensorflow as tf
sess = tf.InteractiveSession()

with tf.name_scope("StringSequence") as scope:
    left = tf.constant("aaa",name="LEFT")
    middle = tf.placeholder(dtype=tf.string, name="MIDDLE")
    right = tf.constant("ccc",name="RIGHT")
    complete = tf.add_n([left,middle,right],name="COMPLETE") #fails here
sess.run(complete,feed_dict={middle:"BBB"})
#writer = tf.train.SummaryWriter("/users/mu/test_out/", sess.graph_def)

4 个答案:

答案 0 :(得分:17)

感谢您的问题,我们优先在TensorFlow中添加对字符串连接的支持,并将其添加到this commit中。字符串连接使用现有的tf.add()运算符实现,以匹配NumPy's add operator的行为(包括广播)。

要实现您的示例,您可以写:

complete = left + middle + right

...或者等效地,但是如果你想命名结果张量:

complete = tf.add(tf.add(left, middle), right, name="COMPLETE")

我们尚未在tf.add_n()(或tf.reduce_sum()之类的相关操作)中添加对字符串的支持,但如果有用例,则会考虑这一点。

注意:要立即使用此功能,您需要build TensorFlow from source。新的操作系统将在下一版TensorFlow(0.7.0)中提供。

答案 1 :(得分:3)

我相信你正在寻找sparse_concat op: https://www.tensorflow.org/versions/master/api_docs/python/sparse_ops.html#sparse_concat

add_n将一起添加数值。

答案 2 :(得分:3)

我知道这不是一个直接的答案,并且不希望这些隐藏在评论中。

如果您想要合并现有库未涵盖的操作,则可以创建custom Op。要合并您的自定义操作,您需要:

  • 在C ++文件中注册新的Op。 Op注册与实现无关,并描述了如何调用Op的语义。例如,它定义Op名称,并指定其输入和输出。
  • 在C ++中实现Op。此实现称为内核",可以有多个内核用于不同的体系结构(例如CPU,GPU)或输入/输出类型。
  • 创建一个Python包装器。这个包装器是用于创建Op的公共API。从Op注册生成默认包装器,可以直接使用或添加到。
  • 可选地,编写一个函数来计算Op的渐变。
  • 或者,编写一个描述Op的输入和输出形状的函数。这允许形状推断与您的Op一起使用。
  • 通常在Python中测试Op。如果定义渐变,则可以使用Python GradientChecker验证它们。

您提出的问题是否非常相关,并且可能会成为将来使用字符串类型与TensorFlow的较高Google搜索结果之一;因此,这种解决方案的途径需要提供,以便其他人意识到存在。

答案 3 :(得分:2)

目前还没有办法做到这一点,AFAIK。

我认为这是一个令人失望的答案,我已提交issue #701 on GitHub来跟踪此请求。