tensorflow的共享變數,tf.Variable(),tf.get_variable(),tf.Variable_scope(),tf.name_scope()聯繫與區別

在訓練深度網路時,為了減少需要訓練參數的個數(比如具有simase結構的LSTM模型)、或是多機多卡並行化訓練大數據大模型(比如數據並行化)等情況時

,往往需要共享變數。另外一方面是當一個深度學習模型變得非常複雜的時候,往往存在大量的變數和操作,如何避免這些變數名和操作名的唯一不重複,同時維護一個條理清晰的graph非常重要。因此,tensorflow中用tf.Variable(),tf.get_variable(),tf.Variable_scope(),tf.name_scope()幾個函數來實現:

1、tf.Variable(<variable_name>),tf.get_variable(<variable_name>)的作用與區別:

tf.Variable(<variable_name>)會自動檢測命名衝突並自行處理,但tf.get_variable(<variable_name>)則遇到重名的變數創建且變數名沒有設置為共享變數時,則會報錯。

tf.Variable(<variable_name>)和tf.get_variable(<variable_name>)都是用於在一個name_scope下面獲取或創建一個變數的兩種方式,區別在於:

tf.Variable(<variable_name>)用於創建一個新變數,在同一個name_scope下面,可以創建相同名字的變數,底層實現會自動引入別名機制,兩次調用產生了其實是兩個不同的變數。

tf.get_variable(<variable_name>)用於獲取一個變數,並且不受name_scope的約束。當這個變數已經存在時,則自動獲取;如果不存在,則自動創建一個變數。

2、tf.name_scope(<scope_name>)與tf.variable_scope(<scope_name>):

tf.name_scope(<scope_name>):主要用於管理一個圖裡面的各種op,返回的是一個以scope_name命名的context manager。一個graph會維護一個name_space的

堆,每一個namespace下面可以定義各種op或者子namespace,實現一種層次化有條理的管理,避免各個op之間命名衝突。

tf.variable_scope(<scope_name>):一般與tf.name_scope()配合使用,用於管理一個graph中變數的名字,避免變數之間的命名衝突,tf.variable_scope(<scope_name>)允許在一個variable_scope下面共享變數。

需要注意的是:創建一個新的variable_scope時不需要把reuse屬性設置未False,只需要在使用的時候設置為True就可以了。

with tf.variable_scope("image_filters1") as scope1:

result1 = my_image_filter(image1)

with tf.variable_scope(scope1, reuse = True)

result2 = my_image_filter(image2)

參考文獻:

TF Boys (TensorFlow Boys ) 養成記(三): TensorFlow 變數共享

tensorflow.org/versionsPython/tf/Graph#name_scope


推薦閱讀:

為什麼 Deep Learning 目前在 NLP 上還沒有什麼成功的應用?
需要一個「隨機梯度下降」的詳細教程?
目標檢測SSD相對於YOLO與faster-RCNN做了哪些改進?效果如何呢?
行為識別(action recognition)目前的難點在哪?
訓練集準確率接近100%,驗證集準確率80%但是隨著訓練step增加不增也不降。算是過擬合還是欠擬合?

TAG:深度学习DeepLearning | 自然语言处理 | TensorFlow |