2016-11-22 61 views
0

當我們運行models/syntaxnet/$ echo "sentence to parse" | ./syntaxnet/demo.sh時,哪個特定的張量確實收到「句子解析」?SyntaxNet:parser_eval.py如何接收stdin?

我製作了一個SyntaxNet服務器(AWS,django)來幫助我的其他會話任務。每次我發送一個句子查詢到我的服務器,大約需要3.5秒才能得到解析的句子。

這對我的任務來說不夠快。所以我試圖找出瓶頸在哪裏。 我發現import tensorflow as tf需要0.8秒,實際上需要1.6秒(2 * 0.8秒),因爲SyntaxNet有兩個步驟(POS標記和解析),甚至在它加載參數和構建圖之前。

我希望我的服務器總是'清醒',並準備用預先加載的圖表和參數來解析句子。 所以我嘗試調整SyntaxNet的工作如下。該會話通過input()連續接收用戶輸入,並打印計算出的張量並永不關閉。

import tensorflow as tf 
def multiplication(sess): 
    x1 = int(input()) 
    matrix1 = tf.constant([[x1, x1]] 
    matrix2 = tf.constant([[2],[2]]) 
    product = sess.run([tf.matmul(matrix1, matrix2)]) 
    return product 
with tf.Session() as sess: 
    while True: 
     print(multiplication(sess)) 
------------------------------------------ 
1 
[array([[4]], dtype=int32)] 
2 
[array([[8]], dtype=int32)] 
3 
[array([[12]], dtype=int32)] 

但是,我不能在哪裏實施input()部分。 當我們運行models/syntaxnet/$ echo "sentence to parse" | ./syntaxnet/demo.sh, demo.sh如何收到標準輸入?換句話說,「句子解析」去哪裏?我在bash腳本中找不到任何read

所以我就直接奔parser_eval通過

python bazel-bin/syntaxnet/parser_eval \ 
    --input=stdin \ 
    --output=stdout-conll \ 
    --hidden_layer_sizes=64 \ 
    --arg_prefix=brain_tagger \ 
    --graph_builder=structured \ 
    --task_context=syntaxnet/models/parsey_mcparseface/context.pbtxt \ 
    --model_path=syntaxnet/models/parsey_mcparseface/tagger-params \ 
    --slim_model \ 
    --batch_size=1024 \ 
    --alsologtostderr \ 

,並試圖找到哪裏蟒蛇文件syntaxnet/parser_eval.py接收輸入。

下面看來parser.evaluation ['documents']以某種方式收到stdin。

def Eval(sess): 
... 
... 
    while True: 
    tf_eval_epochs, tf_eval_metrics, tf_documents = sess.run([ 
       parser.evaluation['epochs'], 
       parser.evaluation['eval_metrics'], 
       parser.evaluation['documents'], 
      ]) 

      if len(tf_documents): 
      logging.info('Processed %d documents', len(tf_documents)) 
      num_documents += len(tf_documents) 
      sess.run(sink, feed_dict={sink_documents: tf_documents}) 

      num_tokens += tf_eval_metrics[0] 
      num_correct += tf_eval_metrics[1] 
      if num_epochs is None: 
      num_epochs = tf_eval_epochs 
      elif num_epochs < tf_eval_epochs: 
      break 
... 
... 
def main(unused_argv): 
    print >> sys.stderr, "parser_eval.py main start", time.time() 
    logging.set_verbosity(logging.INFO) 
    temp_counter = 0 

    while True: 
    with tf.Session() as sess: 
     Eval(sess, temp_counter) 
     temp_counter +=1 

if __name__ == '__main__': 
    tf.app.run() 

我也找到了graph_builder.pygen_parser_ops.py,但無法找到其具體的張量或變量接收標準輸入句子呢。

您能解釋一下SyntaxNet接收stdin語句的位置?

如果你能回答一些相關的問題,這也會有幫助。

  • 我怎樣才能把裏面parser_eval.py while True:環(這個我試過一些地方在parser_eval.py,但它接收標準輸入一次。)
  • 能tensorflow服務幫助這個問題?

在此先感謝。

+0

您可能想要觀看此問題:https://github.com/tensorflow/models/issues/2015 – adrin

回答

0

語法網protoio包有實用程序來完成此讀取。