2015-12-13 78 views
7

我使用了很多dtype="str"数据。我一直在尝试构建一个简单的图,如https://www.tensorflow.org/versions/master/api_docs/python/train.html#SummaryWriter合并TensorFlow中的字符串张量

对于一个简单的操作,我想使用的字符串连接在一起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("https://stackoverflow.com/users/mu/test_out/", sess.graph_def) 

回答

2

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

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

+0

OP可以添加新的[TensorFlow操作](https://www.tensorflow.org/versions/master/how_tos/adding_an_op/index.html)吗? –

+1

是的,那将是一种方法。我们欢迎捐助 - 这显然是多人想要的。 – dga

+1

我很兴奋,但不会持续几个月,因为我仍然需要通过基本的TensorFlow示例,GPU示例,然后让我的C++达到速度。我目前正在将[神经网络和深度学习](http://neuralnetworksanddeeplearning.com/)翻译成F#,以利用我的F#知识学习深度学习和Python。但是,我确信我已经开始掌握TensorFlow,所以我会保持在榜单上。谢谢。 –

3

我知道这不是一个直接的答案,也不希望它在评论中保持隐藏。

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

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

你问的问题是否非常相关,并可能成为未来使用带有TensorFlow字符串类型的Google搜索结果中的一个;因此需要提供解决方案的途径,以便其他人知道它存在。

15

感谢您的问题,我们优先添加对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()),但会考虑这一点,如果有用例。

NOTE:要立即使用此功能,您需要build TensorFlow from source。新操作将在下一个TensorFlow(0.7.0)版本中提供。