TensorFlow程式碼初識
阿新 • • 發佈:2019-01-03
直接看程式碼
import tensorflow as tf # tf.Variable生成的變數,每次迭代都會變化, # 這個變數也就是我們要去計算的結果,所以說你要計算什麼,你是不是就把什麼定義為Variable ''' TensorFlow程式可以通過tf.device函式來指定執行每一個操作的裝置。 這個裝置可以是本地的CPU或者GPU,也可以是某一臺遠端的伺服器。 TensorFlow會給每一個可用的裝置一個名稱,tf.device函式可以通過裝置的名稱,來指定執行運算的裝置。比如CPU在TensorFlow中的名稱為/cpu:0。 在預設情況下,即使機器有多個CPU,TensorFlow也不會區分它們,所有的CPU都使用/cpu:0作為名稱。 –而一臺機器上不同GPU的名稱是不同的,第n個GPU在TensorFlow中的名稱為/gpu:n。 –比如第一個GPU的名稱為/gpu:0,第二個GPU名稱為/gpu:1,以此類推。 –TensorFlow提供了一個快捷的方式,來檢視執行每一個運算的裝置。 –在生成會話時,可以通過設定log_device_placement引數來列印執行每一個運算的裝置。 –除了可以看到最後的計算結果之外,還可以看到類似“add: /job:localhost/replica:0/task:0/cpu:0”這樣的輸出 –這些輸出顯示了執行每一個運算的裝置。比如加法操作add是通過CPU來執行的,因為它的裝置名稱中包含了/cpu:0。 –在配置好GPU環境的TensorFlow中,如果操作沒有明確地指定執行裝置,那麼TensorFlow會優先選擇GPU''' with tf.device('/cpu:0'): x = tf.Variable(3, name='x') y = tf.Variable(4, name='y') f = x*x*y + y + 2 # 建立一個計算圖的一個上下文環境 # 配置裡面是把具體執行過程在哪裡執行給打印出來 sess = tf.Session(config=tf.ConfigProto(log_device_placement=True)) # 碰到session.run()就會立刻去呼叫計算 sess.run(x.initializer) sess.run(y.initializer) result= sess.run(f) print(result) sess.close()
通常session操作
import tensorflow as tf x = tf.Variable(3, name='x') y = tf.Variable(4, name='y') f = x*x*y + y + 2 # 在with塊內部,session被設定為預設的session with tf.Session() as sess: x.initializer.run() # 等價於 tf.get_default_session().run(x.initializer) y.initializer.run() result= f.eval() # 等價於 tf.get_default_session().run(f) print(result)
全域性變數初始化
import tensorflow as tf x = tf.Variable(3, name='x') y = tf.Variable(4, name='y') f = x*x*y + y + 2 # 可以不分別對每個變數去進行初始化 # 並不立即初始化,在run執行的時候才初始化 init = tf.global_variables_initializer() with tf.Session() as sess: init.run() result = f.eval() print(result)
import tensorflow as tf x = tf.Variable(3, name='x') y = tf.Variable(4, name='y') f = x*x*y + y + 2 init = tf.global_variables_initializer() # InteractiveSession和常規的Session不同在於,自動預設設定它自己為預設的session # 即無需放在with塊中了,但是這樣需要自己來close session,但在Jupyter可方便使用 sess = tf.InteractiveSession() init.run() result = f.eval() print(result) sess.close() # TensorFlow程式會典型的分為兩部分,第一部分是建立計算圖,叫做構建階段, # 這一階段通常建立表示機器學習模型的的計算圖,和需要去訓練模型的計算圖, # 第二部分是執行階段,執行階段通常執行Loop迴圈重複訓練步驟,每一步訓練小批量資料, # 逐漸的改進模型引數
圖的管理
import tensorflow as tf # 任何建立的節點會自動加入到預設的圖 x1 = tf.Variable(1) print(x1.graph is tf.get_default_graph()) # 大多數情況下上面執行的很好,有時候或許想要管理多個獨立的圖 # 可以建立一個新的圖並且臨時使用with塊是的它成為預設的圖 graph = tf.Graph() x3 = tf.Variable(3) with graph.as_default(): x2 = tf.Variable(2) print(x2.graph is graph) print(x2.graph is tf.get_default_graph()) print(x3.graph is tf.get_default_graph())
圖的生命週期
import tensorflow as tf # 當去計算一個節點的時候,TensorFlow自動計算它依賴的一組節點,並且首先計算依賴的節點 w = tf.constant(3) x = w + 2 y = x + 5 z = x * 3 with tf.Session() as sess: print(y.eval()) # 這裡為了去計算z,又重新計算了x和w,除了Variable值,tf是不會快取其他比如contant等的值的 # 一個Variable的生命週期是當它的initializer執行的時候開始,到會話session close的時候結束 print(z.eval()) # 如果我們想要有效的計算y和z,並且又不重複計算w和x兩次,我們必須要求TensorFlow計算y和z在一個圖裡 with tf.Session() as sess: y_val, z_val = sess.run([y, z]) print(y_val) print(z_val)