【问题标题】:Merge string tensors in TensorFlow在 TensorFlow 中合并字符串张量
【发布时间】:2016-03-18 18:33:35
【问题描述】:

我处理大量 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)

【问题讨论】:

    标签: python string concatenation tensorflow


    【解决方案1】:

    感谢您的提问,我们优先在 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。新的 op 将在 TensorFlow 的下一版本 (0.7.0) 中提供。

    【讨论】:

      【解决方案2】:

      我相信 sparse_concat 操作是您正在寻找的: https://www.tensorflow.org/versions/master/api_docs/python/sparse_ops.html#sparse_concat

      add_n 将数值相加。

      【讨论】:

      • 你找到了让它工作的方法吗?应用它有点令人困惑。
      【解决方案3】:

      我知道这不是一个立竿见影的答案,并且不希望它一直隐藏在 cmets 中。

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

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • OP可以添加一个新的TensorFlow op吗?
        • 是的,这是一种方法。我们欢迎您的贡献 - 这显然是多人想要的。
        • 我很受诱惑,但几个月后我仍然需要完成基本的 TensorFlow 示例、GPU 示例,然后让我的 C++ 加速。我目前正在将Neural Networks and Deep Learning 翻译成 F#,以利用我的 F# 知识来学习深度学习和 Python。但是,既然您确认我开始掌握 TensorFlow,我将把它放在列表的首位。谢谢。
        • dga 关于@Ian Goodfellow 的回答,有没有办法用 sparse_concat 做到这一点?
        • 我不这么认为。稀疏张量的元素仍然是单独的字符串,没有办法将字符串对象本身连接起来。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-11
        • 1970-01-01
        • 2018-08-09
        • 2018-10-12
        • 1970-01-01
        相关资源
        最近更新 更多