2016-11-23 100 views
1

我使用的張量流模型如iris predict examples中所述。因爲這個我沒有會話對象。現在我想用.eval()將標籤轉換爲numpy數組。沒有會話就會出現錯誤。Tensorflow eval()無會話或將變量移動到其他會話

Traceback (most recent call last): 
File "myfile.py", line 273, in <module> 
    tf.app.run() 
File "/usr/local/lib/python3.4/site-packages/tensorflow/python/platform/app.py", line 30, in run 
    sys.exit(main(sys.argv)) 
File "myfile.py", line 270, in main 
    train_and_eval() 
File "myfile.py", line 258, in train_and_eval 
    label.eval() 
File "/usr/local/lib/python3.4/site-packages/tensorflow/python/framework/ops.py", line 559, in eval 
    return _eval_using_default_session(self, feed_dict, self.graph, session) 
File "/usr/local/lib/python3.4/site-packages/tensorflow/python/framework/ops.py", line 3642, in _eval_using_default_session 
    raise ValueError("Cannot evaluate tensor using `eval()`: No default " 
ValueError: Cannot evaluate tensor using `eval()`: No default session is registered. Use `with sess.as_default()` or pass an explicit session to `eval(session=sess)` 

有沒有可能訪問/獲取會話模型在後臺使用?或者還有其他的可能性將張量轉換爲一個numpy數組嗎?

如果我創建一個新的會話,那麼似乎tensorflow移動到這個會話,但沒有訪問該變量。將顯示一個蟒蛇print(),但隨後會運行inifite。我怎樣才能解析一個變量到這個新的會話?

網的另一部分工作得很好 - 它只是這個特別的事情的張量轉換爲numpy的陣列

COLUMNS = ["col1", "col2", "col3", "target"] 
    LABEL_COLUMN = "target" 
    CATEGORICAL_COLUMNS = ["col1", "col2", "col3"] 

    def build_estimator(model_dir): 
     col1 = tf.contrib.layers.sparse_column_with_hash_bucket(
      "col1", hash_bucket_size=10000) 
     col2........ 

     wide_columns = [col1, col2, col3] 
     deep_columns = [ 
      tf.contrib.layers.embedding_column(col1, dimension=7), 
      tf.contrib.layers.embedding_column(col2, dimension=7), 
      tf.contrib.layers.embedding_column(col3, dimension=7) 
     ] 

     m = tf.contrib.learn.DNNLinearCombinedClassifier(...) 
     return m 

    def input_fn(file_names, batch_size): 
     ... 
     label = tf.string_to_number(examples_dict[LABEL_COLUMN], out_type=tf.int32) 
     return feature_cols, label 

    def train_and_eval(): 
     model_dir = "./model/" 
     print(model_dir) 

     m = build_estimator(model_dir) 
     m.fit(input_fn=lambda: input_fn(train_file_name, batch_size), steps=steps) 
     results = m.evaluate(input_fn=lambda: input_fn(test_file_name, batch_size), 
      steps=1) 
     pred_m = m.predict(input_fn=lambda: input_fn(test_file_name, batch_size)) 


     sess = tf.InteractiveSession() 
     with sess.as_default(): 
      print("Is a session there?") 
      _, label = input_fn(test_file_name, batch_size) 
      label.eval() 
      print(label) 

    def main(_): 
     train_and_eval() 

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

新的會話在代碼片段的末尾開始:

 sess = tf.InteractiveSession() 
     with sess.as_default(): 
      print("Is a session there?") 
      _, label = input_fn(test_file_name, batch_size) 
      label.eval() 
      print(label) 

回答

1

你需要一個會話,你需要能夠訪問它們之前,初始化變量:

with Session() as sess: 
    sess.run(tf.global_variables_initializer()) 
    ... 
    label_numpy = label.eval() 
+0

感謝您的支持。但是這並不像它被問到的那樣工作。我可以使用新會話(這已經與我的代碼一起工作),但我無法訪問其他會話的變量。我如何將它們傳遞給新會話?或者,我該如何更改我的代碼/虹膜預測示例以使用顯式會話,或者如何才能訪問此代碼的默認會話? – Gersee

0

我改變了順序,以解決我的問題。

 import tensorflow as tf 
    v= tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]]) 
    result = tf.clip_by_value(v, 2.5, 4.5).eval() 
    with tf.Session() as sess: 
      print(sess.run(result)) 

然後我IDE警告「ValueError異常:使用eval()無法計算張:沒有默認會話被註冊使用with sess.as_default()或傳遞一個明確的會議eval(session=sess)

之後,我把它改爲:

import tensorflow as tf 
    v= tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]]) 
    with tf.Session() as sess: 
     result = tf.clip_by_value(v, 2.5, 4.5).eval() 
     print(sess.run(result)) 

然後問題就解決了。

0

由於您使用的估計,你可以評估這種方式:

evaluate_result = estimator.evaluate(input_fn=lambda: my_input_fn(INPUT_FILE_PATH, BATCH_SIZE)) 

它會返回一個包含在model_fn規定的評價指標由名稱作爲鍵的字典,以及作爲一款入門global_step其中包含的價值執行此評估的全球步驟。

否則,你可以使用你必須初始化的全局變量的會話:

with Session() as sess: 
    sess.run(tf.global_variables_initializer()) 

您將能夠評估正常的方式和您的會議將有機會獲得你的模型。