引言:
按照我的理解,graph相當於一塊空白的面包板(電路板,可以在上面插電路元件設計電路,供電調試),上面搭建了許多子模塊,自頂向下構成一整個功能電路,整個模塊有輸入輸出端口,里面的子模塊或者部分子模塊
構成的模塊也有輸入和輸出端口。搭建好的這個電路板就是 'graph',而測試(執行)相應模塊都需要開一個session,上面有很多模塊可以調試,也就是說一個graph可以開多個session來執行各自模塊的輸入輸出過程。借網上dao來的圖作個說明:
接下來看一小段代碼:
參考鏈接:https://blog.csdn.net/vinceee__/article/details/88075451 https://blog.csdn.net/vinceee__/article/details/88075451
注:以下偽代碼僅幫助理解
1 val = tf.variable(initilizer, ...) #變量定義 2 const_1 = tf.constant() #常量定義 3 data =3 #定義 4 op = tf.assign(val, const_1) #定義賦值操作 5 c = tf.placeholder(dtype= ,shape = []) #placeholder占位符定義 6 #使用之前定義的變量, 需要定義一個初始化操作init, sess開始后執行變量初始化 7 init = tf.global_varibales_initializer()#全局變量初始化操作 8 with tf.session() as sess: 9 sess.run(init) #執行初始化操作 10 sess.run(op) #執行操作: 將常量const_1賦值給變量val 11 print(sess.run(val)) 12 print(sess.run(c, feed_dict = {c:data})#將data值傳遞到c這個占位符,執行打印 c
以上代碼沒有新建graph,默認使用的是TensorFlow的全局的defaultgraph.如果需要使用自己定義的graph,則使用with tf.graph().as_default()來取代默認的全局計算圖
一、GRAPH
1、有關graph
計算圖graph 由許多個node 組成,node又由name(名稱),op(操作),input(輸入),attrs(屬性:dtype,shape, size, value... ...構成),對於tf.constant()函數只會產生一個node,但是對於tf.varibale(initialize, name),其中生成一個initializer初始化器,一共會產生三個node:
1)variable:變量維護(不存放實際的值)
2) Varibale/assign: 變量分配
3) variable/read: 變量讀取使用
使用變量時需要進行變量初始化:生成初始化器對象,再在sess中執行init.
2、graph的使用
1) Tf.get_default_graph(): 獲得當前默認graph
2) With Tf.Graph().as_default(): tf.graph()創建一個新的graph,並通過as_default()設置為上下文中的默認圖(局部的),即with下面所有的定義都是在這個新建的 (局部的)graph中。
With之外另外的graph作為默認,get_default_graph可以獲得當前的圖。
3) tensorflow 有一個默認的全局graph, 不用定義可直接使用,若需要另外的graph則需要新建(tf.graph()在當前使用with范圍內設置為default)
二、Session
1、有關session
tf.session 是用來運行TensorFlow操作的類,一個session對象封裝了操作執行對象的環境,在這個環境下才可以對tensor對象進行計算,tensor對象不可直接進行計算操作,同時也會負責分配計算資源和變量存放:
1)步驟: build a graph #構建一個計算圖(里面有操作、tensor對象)
launch the graph in a session #基於以上創建的graph創建一個session
evaluate the tensor #執行計算
2) session: 包括一些資源,例如variables, queues, readers 當我們不再需要這些資源時候,我們需要釋放這些資源,釋放資源可以通過執行sess.close(),或者將session作為上下文管理器使用:
with tf.session() as sess:
.... ....
sess.run()
執行到with范圍以外,session資源釋放
3) configProto protocol buffer 公開session的各種配置選項。
ConfigProto詳解:
tf.configProto函數用在創建session的時候對session進行參數配置。
3.1)Tf.ConfigProto(log_device_placement=True)
log_device_placement=True,可以獲取到operations 和tensor 被指派到哪個設備(幾號CPU/GPU)上運行,會在終端打印出各項操作在哪個設備上面運行。
3.2) Tf.ConfigProto(allow_soft_placement=True)
在tf中,通過“with tf.device('cpu:0'):”來手動設置操作運行的設備。如果手動設置的設備不存在或者不可用,就會導致程序等待或者異常,為了防止這種情況,allow_soft_placement=True,可以允許tf自動選擇一個存在並可用的設備
來運行操作。
3.3) 限制GPU的資源使用:
為了加快運行效率,tf在初始化時候會嘗試分配所有可用GPU顯存資源給自己,如果在多人使用的服務器上工作會導致別人無法正常使用GPU。
tf提供了兩種控制GPU資源使用的方法:
3.3.1) 設置動態申請顯存,需要多少就申請多少
sess_config = tf.configProto(log_device_placement=False, allow_soft_placement = True) sess_config.gpu_options.allow_growth = True session = tf.session(config = sess_config)
3.3.2) 限制GPU的使用率,如下兩種方法:
sess_config = tf.configProto(log_device_placement= Fa;se ,allow_soft_placementt= True) sess_config.gpu_options.per_process_gpu_memory_fraction = 0.4#占用40%顯存 session = tf.session(config = sess_config) gpu_options=tf.GPUOptions(per_process_gpu_memory_fraction= 0.4) sess_config = tf.configProto(gpu_options = gpu_options)
3.3.3) 設置使用哪塊GPU:
os.environ['CUDA_VISIBLE_DEVICES']= '0'
os.environ['CUDA_VISIBLE_DEVICES']='0,1'
使用上下文管理器,手動指定session在哪塊gpu上執行
with tf.device('/gpu:0'):
... ... ... ...
with tf.session(config = tf.configProto(log_device_placement=True)) as sess:
print sess.run()
參考網址: https://blog.csdn.net/dcrmg/article/details/79091941
https://www.cnblogs.com/ywheunji/p/11390219.html
4) tf.session.run():
Tf.Session.run( fetches, feed_dict=None):
Fetches: 是個list,里面包括了我們想要輸出的一個或者多個graph元素,tensor/ sparse tensor、operation等,見以上文獻例子。
Feed_dict: 是個dict,里面包括需要輸入的參數名稱和實際參數傳入的key_value 對。
這個method運行一步TensorFlow計算,通過運行需要的graph 片段來執行每個操作和計算fetches里的每個Tensor,用feed_dict里面的值替換相應的輸入值
5) tf.session() as sess: 和 tf.session().as_default() as sess:
g = tf.graph() #新建graph session = tf.session(graph = g) #將新建的graph加載到session with g.as_default() #必須為當前指定default graph(因為可能有多個graph存在)
5.1) with session.as_default() as sess:
g_model = tf.Graph() g_session = tf.Session(graph = g_model) with g_model.as_default() as g: with g_session.as_default() as sess: c = tf.constant(1) print(sess.run(c)) print(tf.get_default_session()) print(tf.get_default_graph()) print(tf.get_default_graph()) print(sess.run(c)) sess.close() print(sess.run(c))
print results:
with之外 sess.close 之前 sess.run(c): 1 也就是說sess沒有自動關閉; 手動sess.close之后,sess.run(c)就error了,而get_default_session只能在with內有效,with外是None.
5.2) tf.session() as sess:
with g_Model.as_default() as g: with g_session as sess: c=tf.constant(1) print(sess.run(c)) print(tf.get_default_session()) print(tf.get_default_graph()) print(tf.get_default_graph()) print(sess.run(c))
print results:
可見:沒有session.as_default(), with 以外sess自動關閉,sess.run(c)就報錯
以上是關於session 和graph的總結,感謝參考文檔的作者,這里作個學習筆記,小白一枚,歡迎大家指正,叩謝~~