TensorFlow入門 - 變數(Variables)

劉美利發表於2018-08-22

訓練模型時,需要使用變數(Variables)儲存和更新引數。Variables是包含張量(tensor)的記憶體緩衝。變數必須要先被初始化(initialize),而且可以在訓練時和訓練後儲存(save)到磁碟中。之後可以再恢復(restore)儲存的變數值來訓練和測試模型。

 

主要參考一下兩類: 
- The tf.Variable class. 
- The tf.train.Saver class.

1.建立(Creation)

建立Variable,需將一個tensor傳遞給Variable()建構函式。可以使用TensorFlow提供的許多ops(操作)初始化張量,參考constants or random values。這些ops都要求指定tensor的shape(形狀)。比如

Create two variables.

weights = tf.Variable(tf.random_normal([784, 200], stddev=0.35), 
name=”weights”) 
biases = tf.Variable(tf.zeros([200]), name=”biases”)

呼叫tf.Variable()函式在graph中增加以下幾個ops: 
- 一個Variable op ,負責儲存變數值。 
- 一個initializer op,負責將變數設為初始值,這實際是tf.assign op。 
- 初始值的op,比如zeros op 。

tf.Variable()返回一個tf.Variable類的例項。

2.裝置安置(Device placement)

使用 with tf.device(…): block,將一個變數安置在一個裝置上。

Pin a variable to CPU.

with tf.device(“/cpu:0”): 
v = tf.Variable(…)

Pin a variable to GPU.

with tf.device(“/gpu:0”): 
v = tf.Variable(…)

Pin a variable to a particular parameter server task.

with tf.device(“/job:ps/task:7”): 
v = tf.Variable(…)

改變變數的一些ops,比如v.assign()和tf.train.Optimizer需要與變數在同一個裝置上。

3.初始化(Initialization)

在執行模型中其他操作之前,必須先對變數進行初始化。最簡單的初始化方法是新增一個對所有變數進行初始化的op,然後再使用model前執行此op。

3.1全域性初始化

使用tf.global_variables_initializer()新增一個op來執行初始化。要在完全構建完模型後,在一個對話(Session)中執行它。

Create two variables.

weights = tf.Variable(tf.random_normal([784, 200], stddev=0.35), 
name=”weights”) 
biases = tf.Variable(tf.zeros([200]), name=”biases”) 

Add an op to initialize the variables.

init_op = tf.global_variables_initializer()

Later, when launching the model

with tf.Session() as sess: 
# Run the init operation. 
sess.run(init_op) 
… 
# Use the model 

3.2 用其他變數值建立變數

用變數A的值初始化另一個變數B,需使用變數A的屬性(property)initialized_value()。可以直接使用變數A的初始值,也可以用之計算新的值。

Create a variable with a random value.

weights = tf.Variable(tf.random_normal([784, 200], stddev=0.35), 
name=”weights”)

Create another variable with the same value as ‘weights’.

w2 = tf.Variable(weights.initialized_value(), name=”w2”)

Create another variable with twice the value of ‘weights’

w_twice = tf.Variable(weights.initialized_value() * 2.0, name=”w_twice”)

3.3自定義初始化

可以給tf.global_variables_initializer()新增一個顯示列表自定義要初始化的變數。參考Variables Documentation瞭解更多。

4.儲存和恢復Saving and Restoring

最簡單的方法是用tf.train.Saver物件,此建構函式在graph中為所有變數(or a specified list)新增save和restore ops。saver物件提供執行這些ops的方法,並指定讀寫checkpoint files的路徑。

4.1 checkpoint檔案

變數儲存在一個二進位制檔案中,包含從變數名稱到張量值的對映。

建立checkpoint files時,可以選擇性地選擇變數名稱來儲存。預設情況,它使用每個Variable的Variable.name屬性。

可以使用inspect_checkpoint庫檢視checkpoint file中的變數,還有print_tensrs_in_checkpoint_file函式。

4.2儲存變數

用tf.train.Saver()建立一個Saver物件來管理模型中所有變數。

Create some variables.

v1 = tf.Variable(…, name=”v1”) 
v2 = tf.Variable(…, name=”v2”) 

Add an op to initialize the variables.

init_op = tf.global_variables_initializer()

Add ops to save and restore all the variables.

saver = tf.train.Saver()

Later, launch the model, initialize the variables, do some work, save the variables to disk.

with tf.Session() as sess: 
sess.run(init_op)

Do some work with the model.

..

Save the variables to disk.

save_path = saver.save(sess, “/tmp/model.ckpt”) 
print(“Model saved in file: %s” % save_path)

先初始化變數,再操作模型,最後儲存變數。

4.3恢復變數

使用同樣的Saver物件恢復變數,恢復變數時,就不用先初始化變數了。

Create some variables.

v1 = tf.Variable(…, name=”v1”) 
v2 = tf.Variable(…, name=”v2”) 

Add ops to save and restore all the variables.

saver = tf.train.Saver()

Later, launch the model, use the saver to restore variables from disk, and

do some work with the model.

with tf.Session() as sess:

Restore variables from disk.

saver.restore(sess, “/tmp/model.ckpt”) 
print(“Model restored.”)

Do some work with the model

無初始化操作,先恢復變數,再操模型。

4.4選擇儲存和恢復的變數

如果不給tf.train.Saver傳遞任何引數,Saver會在graph中處理所有變數。每個變數會存在他們建立時的name下。

通過給tf.train.Saver傳遞一個Python字典,可以指定儲存變數的name。key是要在checkpoint file中使用的name, values指要管理的變數。

注意:

  • 可以建立多個saver,分別儲存不同的變數集合。

  • 如果在對話開始時,只恢復了部分變數,就要對其他變數執行initializer op。參考tf.variables_initializer() 

Create some variables. 

v1 = tf.Variable(…, name=”v1”) 
v2 = tf.Variable(…, name=”v2”) 
… 

Add ops to save and restore only ‘v2’ using the name “my_v2” 

saver = tf.train.Saver({“my_v2”: v2}) 

Use the saver object normally after that. 

【本文轉載自:深度學習實踐,原文連結:https://mp.weixin.qq.com/s/B59uqKZ3aZSpfzXC2lswtA】

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31542119/viewspace-2212517/,如需轉載,請註明出處,否則將追究法律責任。

相關文章