variable_scope
使用tf.variable_scope定義的命名空間,只要空間名稱(chēng)不同乏梁,定義的變量互不干撓贷帮,即使函數(shù)name參數(shù)相同
如果是在相同命名空間下祈惶,
如果是不可重用的(reuse=False),tf. get_variable函數(shù)會(huì)查找在當(dāng)前命名空間下是否存在由tf.get_variable定義的同名變量(而不是tf.Variable定義的)灌灾,如果不存在搓译,則新建對(duì)象,否則會(huì)報(bào)錯(cuò)
如果是可重用的(reuse=True)锋喜,如果存在些己,則會(huì)返回之前的對(duì)象,否則報(bào)錯(cuò)跑芳,
tf. Variable不管在什么情況下都是創(chuàng)建新變量,自己解決命名沖突
下面舉個(gè)例子說(shuō)明
import tensorflow as tf
from tensorflow.python.framework import ops
ops.reset_default_graph()
sess = tf.InteractiveSession()
with tf.variable_scope("scope1"):
w1 = tf.get_variable("w1", initializer=4.)
w2 = tf.Variable(0.0, name="w2")
with tf.variable_scope("scope2"):
w1_p = tf.get_variable("w1", initializer=5.)
w2_p = tf.Variable(1.0, name="w2")
with tf.variable_scope("scope1", reuse=True):
w1_reuse = tf.get_variable("w1")
w2_reuse = tf.Variable(1.0, name="w2")
def compare_var(var1, var2):
print '-----------------'
if var1 is var2:
print sess.run(var2)
print var1.name, var2.name
sess.run(tf.global_variables_initializer())
compare_var(w1, w1_p)
compare_var(w2, w2_p)
compare_var(w1, w1_reuse)
compare_var(w2, w2_reuse)
name_scope
- 使用name_scope命名空間
get_variable不受name_scope命名空間約束
Variable受命名空間約束直颅,但可以自己解決沖突
import tensorflow as tf
from tensorflow.python.framework import ops
ops.reset_default_graph()
sess = tf.InteractiveSession()
with tf.name_scope("scope1"):
w1 = tf.Variable(0.0, name="w1")
w2 = tf.get_variable("w2", initializer=4.)
with tf.name_scope("scope1"):
w1_p = tf.Variable(1.0, name="w1")
w2_p = tf.get_variable("w1", initializer=5.)
def compare_var(var1, var2):
print '-----------------'
if var1 is var2:
print sess.run(var2)
print var1.name, var2.name
print '-----------'
sess.run(tf.global_variables_initializer())
compare_var(w1, w2)
compare_var(w1_p, w2_p)
總結(jié)兩個(gè)命名空間的作用不同
variable_scope與get_variable搭配使用可以使得共享變量
name_scope主要用來(lái)tensorboard可視化
tensorboard可視化
import tensorflow as tf
from tensorflow.python.framework import ops
ops.reset_default_graph()
sess = tf.InteractiveSession()
log_dir = '../datachuli'
def practice_num():
# 練習(xí)1: 構(gòu)建簡(jiǎn)單的計(jì)算圖
input1 = tf.constant([1.0, 2.0, 3.0],name="input1")
input2 = tf.Variable(tf.random_uniform([3]),name="input2")
output = tf.add_n([input1,input2],name = "add")
sess.run(tf.global_variables_initializer())
sess.run(output)
#生成一個(gè)寫(xiě)日志的writer博个,并將當(dāng)前的tensorflow計(jì)算圖寫(xiě)入日志
writer = tf.summary.FileWriter(log_dir + "/log",tf.get_default_graph())
writer.close()
practice_num()
- 加入命名空間,tensorboard可視化將非常有層次感功偿,更清晰
ops.reset_default_graph()
sess = tf.InteractiveSession()
def practice_num_modify():
#將輸入定義放入各自的命名空間中盆佣,從而使得tensorboard可以根據(jù)命名空間來(lái)整理可視化效果圖上的節(jié)點(diǎn)
# 練習(xí)1: 構(gòu)建簡(jiǎn)單的計(jì)算圖
with tf.name_scope("input1"):
input1 = tf.constant([1.0, 2.0, 3.0],name="input1")
with tf.name_scope("input2"):
input2 = tf.Variable(tf.random_uniform([3]),name="input2")
with tf.name_scope('add1'):
output = tf.add_n([input1,input2],name = "add")
sess.run(tf.global_variables_initializer())
sess.run(output)
#生成一個(gè)寫(xiě)日志的writer,并將當(dāng)前的tensorflow計(jì)算圖寫(xiě)入日志
writer = tf.summary.FileWriter(log_dir + "/log_namescope",tf.get_default_graph())
writer.close()
practice_num_modify()
可以點(diǎn)擊add1和input2右上角+號(hào)展開(kāi)
展開(kāi)前
展開(kāi)后