1. 程式人生 > >TensorFlow程式碼初識

TensorFlow程式碼初識

直接看程式碼

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)