1. 程式人生 > 實用技巧 >Tensorflow同時載入使用多個模型

Tensorflow同時載入使用多個模型

在Tensorflow中,所有操作物件都包裝到相應的Session中的,所以想要使用不同的模型就需要將這些模型載入到不同的Session中並在使用的時候申明是哪個Session,從而避免由於Session和想使用的模型不匹配導致的錯誤。而使用多個graph,就需要為每個graph使用不同的Session,但是每個graph也可以在多個Session中使用,這個時候就需要在每個Session使用的時候明確申明使用的graph。

g1 = tf.Graph() # 載入到Session 1的graph
g2 = tf.Graph() # 載入到Session 2的graph

sess1 = tf.Session(graph=g1) #
Session1 sess2 = tf.Session(graph=g2) # Session2 # 載入第一個模型 with sess1.as_default(): with g1.as_default(): tf.global_variables_initializer().run() model_saver = tf.train.Saver(tf.global_variables()) model_ckpt = tf.train.get_checkpoint_state(“model1/save/path”) model_saver.restore(sess, model_ckpt.model_checkpoint_path)
# 載入第二個模型 with sess2.as_default(): # 1 with g2.as_default(): tf.global_variables_initializer().run() model_saver = tf.train.Saver(tf.global_variables()) model_ckpt = tf.train.get_checkpoint_state(“model2/save/path”) model_saver.restore(sess, model_ckpt.model_checkpoint_path) ...
# 使用的時候 with sess1.as_default(): with sess1.graph.as_default(): # 2 ... with sess2.as_default(): with sess2.graph.as_default(): ... # 關閉sess sess1.close() sess2.close()

注:1、在1處使用as_default使session在離開的時候並不關閉,在後面可以繼續使用知道手動關閉;2、由於有多個graph,所以sess.graph與tf.get_default_value的值是不相等的,因此在進入sess的時候必須sess.graph.as_default()明確申明sess.graph為當前預設graph,否則就會報錯。

PS:不同框架的模型(tf, caffe, torch等)在載入的很有可能導致底層的cuDNN分配出現問題從而報錯,這種一般可以嘗試通過模型的載入順序來解決。

TensorFlow函式:tf.Session()和tf.Session().as_default()的區別

   tf.Session().as_default():建立一個預設會話

   那麼問題來了,會話和預設會話有什麼區別呢?TensorFlow會自動生成一個預設的計算圖,如果沒有特殊指定,運算會自動加入這個計算圖中。TensorFlow中的會話也有類似的機制,但是TensorFlow不會自動生成預設的會話,而是需要手動指定。

   tf.Session()建立一個會話,當上下文管理器退出時會話關閉和資源釋放自動完成。

   tf.Session().as_default()建立一個預設會話,當上下文管理器退出時會話沒有關閉,還可以通過呼叫會話進行run()和eval()操作,程式碼示例如下:
tf.Session()程式碼示例:
import tensorflow as tf
a = tf.constant(1.0)
b = tf.constant(2.0)
with tf.Session() as sess:
   print(a.eval())   
print(b.eval(session=sess))
執行結果如下:
1.0
RuntimeError: Attempted to use a closed Session.

在列印張量b的值時報錯,報錯為嘗試使用一個已經關閉的會話。使用 tf.Session().as_default()不會有這個問題。

對於run()方法也是一樣,如果想讓預設會話在退出上下文管理器時關閉會話,可以呼叫sess.close()方法。

import tensorflow as tf
a = tf.constant(1.0)
b = tf.constant(2.0)
with tf.Session().as_default() as sess:
   print(a.eval())  
   sess.close()
print(b.eval(session=sess))
1.0
RuntimeError: Attempted to use a closed Session.

參考:
https://www.tensorflow.org/api_docs/python/tf/Session
https://stackoverflow.com/questions/41607144/loading-two-models-from-saver-in-the-same-tensorflow-session

https://www.cnblogs.com/arkenstone/p/7016481.html