2015-12-13 128 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)版本中提供。