【AI實戰】快速掌握TensorFlow(二):計算圖、會話


在前面的文章中,咱們已經完成了AI基礎環境的搭建(見文章:Ubuntu + Anaconda + TensorFlow + GPU + PyCharm搭建AI基礎環境),以及初步瞭解了TensorFlow的特色和基本操做(見文章:快速掌握TensorFlow(一)),接下來將繼續學習掌握TensorFlow。前端

本文主要是學習掌握TensorFlow的計算圖、會話操做。python

 

 
計算圖是TensorFlow的核心概念,使用圖(Graph)來表示計算任務,由節點和邊組成。TensorFlow由前端負責構建計算圖,後端負責執行計算圖。
爲了執行圖的計算,圖必須在會話(Session)裏面啓動,會話將圖的操做分發到CPU、GPU等設備上執行。
下面將介紹如何在TensorFlow裏面建立會話、圖以及基本操做。算法

一、圖(Graph)
TensorFlow Python庫已經有一個默認圖 (default graph),若是沒有建立新的計算圖,則默認狀況下是在這個default graph裏面建立節點和邊。
在圖裏面添加節點很是方便。例如如今要建立這樣的計算圖,兩個張量相加,以下圖:
 
代碼以下:後端

import tensorflow as tf 
a=tf.constant([1.0,2.0], name='a') 
b=tf.constant([3.0,4.0], name='b') 
result = tf.add(a,b)

如今默認圖就有了三個節點,兩個constant(),和一個add()。
爲了真正使兩個張量相加並獲得結果,就必須在會話裏面啓動這個圖。微信

二、會話(Session)
要啓動計算圖,首先要建立一個Session對象。
使用tf.Session()建立會話,調用run()函數執行計算圖。若是沒有傳入任何建立參數,會話構造器將啓動默認圖。若是要指定某個計算圖,則傳入計算圖參數(如g1),則建立會話方式爲tf.Session(graph=g1)建立會話(Session)主要有如下三種方式:
(1)建立一個會話網絡

#啓動默認圖
sess=tf.Session()
result_value = sess.run(result)
print(result_value)
# ==> [4.0 6.0]

# 任務完成, 關閉會話.
sess.close()

(2) 建立一個會話
Session在使用完後須要關閉以釋放資源,除了顯式調用close外,也可使用「with」代碼塊 來自動完成關閉動做。代碼以下:分佈式

with tf.Session() as sess:
    result_value = sess.run(result)
    print(result_value)
    # ==> [4.0 6.0]

(3)建立一個默認的會話函數

sess=tf.Session()
with sess.as_default():
    result_value = result.eval()
    print(result_value)

當指定默認會話後,能夠經過tf.Tensor.eval函數來計算一個張量的取值。oop

(4)建立一個交互式會話
在交互式環境下(例如IPython),使用設置默認會話的方式來獲取張量的取值更加方便,TensorFlow提供了一種在交互式環境下直接構建默認會話的函數:tf.InteractiveSession,該函數會自動將生成的會話註冊爲默認會話,使用 tf.Tensor.eval()代替 Session.run(),代碼以下:學習

sess= tf.InteractiveSession()
result_value = result.eval()
print(result_value)
sess.close()

三、構建多個計算圖
在TensorFlow中能夠構建多個計算圖,計算圖之間的張量和運算是不會共享的,經過這種方式,能夠在同個項目中構建多個網絡模型,而相互之間不會受影響。
使用tf.Graph()函數構建圖,構建多個計算圖的方式以下:

# 構建計算圖g1
g1=tf.Graph()
with g1.as_default():
    # 在計算圖g1中定義變量'v',並設置初始值爲0。
    v=tf.get_variable('v',initializer=tf.zeros_initializer()(shape = [1]))
    
# 構建計算圖g2
g2=tf.Graph()
with g2.as_default():
    # 在計算圖g2中定義變量'v',並設置初始值微1。
    v=tf.get_variable('v',initializer=tf.ones_initializer()(shape = [1]))

# 在計算圖g1中讀取變量'v'的取值
with tf.Session(graph=g1) as sess:
    tf.global_variables_initializer().run()
    with tf.variable_scope('',reuse=True):
        print(sess.run(tf.get_variable('v')))
        # 輸出結果[0.]

# 在計算圖g2中讀取變量'v'的取值
with tf.Session(graph=g2) as sess:
    tf.global_variables_initializer().run()
    with tf.variable_scope('',reuse=True):
        print(sess.run(tf.get_variable('v')))
        # 輸出結果[1.]。

四、指定運行設備
若是電腦有多個GPU,能夠在圖、會話中指定要運行的設備
(1)在圖中指定運行設備

g=tf.Graph()
# 指定計算運行的設備。
with g.device('/gpu:0'):
    result=tf.add(a,b)

(2)在會話中指定運行設備

with tf.Session() as sess:
  with tf.device("/gpu:0"):
    result=tf.add(a,b)

運行的設備用字符串進行標識,目前支持的設備包括:

  • "/cpu:0": 機器的 CPU
  • "/gpu:0": 機器的第一個 GPU,若是有的話
  • "/gpu:1": 機器的第二個 GPU,以此類推

經過以上介紹,已經瞭解了圖、會話的基本操做,使用圖 (graph) 來表示計算任務,使用會話 (Session) 來執行圖。

接下來,咱們將有更多講解TensorFlow的精彩內容,敬請期待!

 

歡迎關注本人的微信公衆號「大數據與人工智能Lab」(BigdataAILab),獲取更多信息

 

推薦相關閱讀

相關文章
相關標籤/搜索