Tensorflow共享變數機制

2021-09-19 07:39:03 字數 3096 閱讀 1022

我們定義變數通常使用tf.variable()的方式進行建立變數,但在某種情況下,乙個模型需要使用其他模型建立的變數,兩個模型一起訓練。比如:對抗網路中的生成器模型和判別器模型。如果使用variable進行建立,那麼得到的是乙個新的變數,而非原來的變數。這時就需引入共享變數解決問題。

使用tf.variable建立變數,每次都會在記憶體中生成乙個新的var。而使用tf.get_variable可以獲取乙個已經存在的變數或者建立乙個新變數。並且get_variable只能定義一次指定名稱的變數。

通常get_variable與vaiiable_scope一起使用。variable_scope的意思是變數作用域。類似於c++中的namespace。在某一作用域中的變數可以被設定為共享的方式,被其他的網路模型使用。

相同作用域中使用get_variable建立兩個相同名字的變數是行不通的,如果真的需要建立兩個相同名字的變數,則需要使用不同的scope將它們隔開。並且scope支援巢狀。

相同變數名舉例:

import tensorflow as tf

with tf.variable_scope("test1"):

var1 = tf.get_variable("first", shape=[2], dtype=tf.float32)

with tf.variable_scope("test2"):

var2 = tf.get_variable("first", shape=[2], dtype=tf.float32)

print(var1.name)

print(var2.name)

輸出為:

test1/first:0

test2/first:0

支援巢狀舉例:

import tensorflow as tf

with tf.variable_scope("test1"):

var1 = tf.get_variable("first", shape=[2], dtype=tf.float32)

with tf.variable_scope("test2"):

var2 = tf.get_variable("second", shape=[2], dtype=tf.float32)

print(var1.name)

print(var2.name)

輸出為:

test1/first:0

test1/test2/second:0

使用get_variable無非就是通過它實現共享變數的功能,故我們可以用variable_scope中的reuse屬性,將其設定為true,表示使用已經定義過的變數。此時在get_variable中將不會建立新的變數,而是去圖中找與name相同的get_variable。(需要建立相同的scope)

變數共享舉例:

import tensorflow as tf

with tf.variable_scope("test1"):

var1 = tf.get_variable("first", shape=[2], dtype=tf.float32, initializer=tf.constant_initializer(0.1))

with tf.variable_scope("test1", reuse=true):

var2 = tf.get_variable("first", shape=[2], dtype=tf.float32)

with tf.session() as sess:

sess.run(tf.global_variables_initializer())

print(sess.run(var1))

print(sess.run(var2))

輸出為:

[0.1 0.1]

[0.1 0.1]

可使用tf.auto_reuse來為reuse賦值,可實現第一次呼叫variable_scope時,傳入的reuse值為false, 再次呼叫variable_scope時傳入reuse的值會自動變為true。

tf.name_scope作用域限制op操作,不限制變數的命名。 也就是說變數只受variable_scope的限制,而操作符卻要受variable_scope和name_scope的雙重限制。

import tensorflow as tf

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

with tf.name_scope("name"):

var1 = tf.get_variable("first", shape=[2], dtype=tf.float32)

x = var1 + 1.0

print(var1.name)

print(x.name)

輸出結果:

test1/first:0

test1/name/add:0

name_scope可用空字元使作用域返回到頂層

import tensorflow as tf

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

with tf.name_scope("name"):

var1 = tf.get_variable("first", shape=[2], dtype=tf.float32)

x = var1 + 1.0

with tf.name_scope(""):

y = 1.0 + x

print(var1.name)

print(x.name)

print(y.name)

輸出結果:

test1/first:0

test1/name/add:0

add:0

tensorflow 共享變數

import tensorflow as tf 設定隨機種子,使得每次隨機初始化都一樣 tf.set random seed 1234 這是我們要共享的變數函式 def share variable input weight tf.get variable weight 2,2 return wei...

Tensorflow共享變數

使用variable宣告變數,同名變數的name後會自動加 1,可以賦初始值,但是需要在session初始化後才會生效。import tensorflow as tf var1 tf.variable 1.0,name firstvar print var1 var1.name var1 tf.va...

Tensorflow 變數的共享

tensorflow exp example sparse tensor classification train validate.py 當你需要train的過程中validate的時候,如果用placeholder來接收輸入資料 那麼乙個compute graph可以完成這個任務。如果你用的是t...