'''created on apr 21, 2017
@author: p0079482
'''#
如何通過tf.variable_scope函式來控制tf.ger_variable函式獲取已經建立過的變數
#在名字為foo的命名空間內建立名字為v的變數
import
tensorflow as tf
with tf.variable_scope(
"foo"):
v = tf.get_variable("
v",shape=[1],initializer=tf.constant_initializer(1.0))
#因為在命名空間foo中已經存在名為v的變數,所有下面的**將會報錯:
#variable foo/v already exists,
with tf.variable_scope("
foo"
): v = tf.get_variable("
v",[1])
#在生成上下文管理器時,將引數reuse設定為true.這樣tf.get_variable函式將直接獲取已經宣告的變數
with tf.variable_scope("
foo",reuse=true):
v1 = tf.get_variable("
v",[1])
print(v==v1) #
輸出為true,代表v,v1代表的是相同的tensorflow中的變數
#將引數reuse設定為true是,tf.variable_scope將只能獲取已經建立過的變數。
#因為在命名空間bar中還沒有建立變數v,所以下面的**將會報錯
with tf.variable_scope("
bar",reuse=true):
v = tf.get_variable("
v",[1])
#如果tf.variable_scope函式使用reuse=none或者reuse=false建立上下文管理器
#tf.get_variable操作將建立新的變數。
#如果同名的變數已經存在,則tf.get_variable函式將報錯
#tensorflow中tf.variable_scope函式是可以巢狀的
with tf.variable_scope("
root"):
#可以通過tf.get_variable_scope().reuse函式來獲取上下文管理器中reuse引數的值
print(tf.get_variable_scope().reuse) #
輸出false,即最外層reuse是false
with tf.variable_scope(
"foo
",reuse=true): #
新建乙個巢狀的上下文管理器並指定reuse為true
print(tf.get_variable_scope().reuse) #
輸出true
with tf.variable_scope("
bar"): #
新建乙個巢狀的上下文管理器,但不指定reuse,這時reuse的取值會和外面一層保持一致
print(tf.get_variable_scope().reuse) #
輸出true
print(tf.get_variable_scope().reuse) #
輸出false
#tf.variable_scope函式生成的上下文管理器也會建立乙個tensorflow中的命名空間
#在命名空間內建立的變數名稱都會帶上這個命名空間作為字首
#所以tf.variable_scope函式除了可以控制tf.get_variable執行的功能之外
#這個函式也提供了乙個管理命名空間的方式
v1 = tf.get_variable("
v",[1])
print(v1.name)#
輸出v:0 "v"為變數的名稱,":0"表示這個變數是生成變數這個運算的第乙個結果
with tf.variable_scope("foo"
): v2 = tf.get_variable("
v",[1])
print(v2.name)#
輸出foo/v:0 在tf.variable_scope中建立的變數,名稱前面會
#加入命名空間的名稱,並通過/來分隔命名空間的名稱和變數的名稱
with tf.variable_scope("foo"
): with tf.variable_scope(
"bar"):
v3 = tf.get_variable("
v",[1])
print(v3.name) #
輸出foo/bar/v:0 命名空間可以巢狀,同時變數的名稱也會加入所有命名空間的名稱作為字首
v4 = tf.get_variable("
v1",[1])
print(v4.name) #
輸出foo/v1:0 當命名空間退出之後,變數名稱也就不會再被加入其字首了
#建立乙個名稱為空的命名空間,並設定reuse=true
with tf.variable_scope("",reuse=true):
v5=tf.get_variable("
foo/bar/v
",[1])#
可以直接通過帶命名空間名稱的變數名來獲取其他命名空間下的變數。
print(v5==v3)
v6=tf.get_variable("
foo/v1
",[1])
print(v6==v4)
#通過tf.variable_scope和tf.get_variable函式,以下**對inference函式的前向傳播結果做了一些改進
def inference(input_tensor,reuse=false):
#定義第一層神經網路的變數和前向傳播過程
with tf.variable_scope('
layer1
',reuse=reuse):
#根據傳進來的reuse來判斷是建立新變數還是使用已經建立好了。在第一次構造網路時需要建立新的變數,
#以後每次呼叫這個函式都直接使用reuse=true就不需要每次將變數傳進來了
weights= tf.get_variable("
weights
",[input_node,layer1_node],initializer=tf.truncated_normal_initializer(stddev=0.1))
biases= tf.get_variable("
biases
",[layer1_node],initializer=tf.constant_initializer(0.0))
layer1 = tf.nn.relu(tf.matmul(input_tensor,weights)+biases)
#類似地定義第二層神經網路的變數和前向傳播過程
with tf.variable_scope('
layer2
',reuse=reuse):
weights=tf.get_variable("
weights
",[layer1_node,output_node],initializer=tf.truncated_normal_initializer(stddev=0.1))
biases=tf.get_variable("
biases
",[output_node],initializer=tf.constant_initializer(0.0))
layer2=tf.matmul(layer1,weights)+biases
#返回最後的前向傳播結果
return
layer2
x=tf.placeholder(tf.float32,[none,input_node],name='
x-input')
y=inference(x)
#在程式中需要使用訓練好的神經網路進行推倒時,可以直接呼叫inference(new_x,true)
83 Tensorflow中的變數管理
created on apr 21,2017 author p0079482 如何通過tf.variable scope函式來控制tf.ger variable函式獲取已經建立過的變數 在名字為foo的命名空間內建立名字為v的變數 import tensorflow as tf with tf.va...
C 中的協變與抗變
using system using system.collections.generic using system.linq using system.text namespace csharp基礎 else console.readline 按照委託簽名,但返回的是子類的例項 public st...
C 中的協變和抗變
net4通過協變和抗變為泛型介面和泛型委託新增了乙個重要擴充套件。協變和抗變指對引數和返回值的型別進行轉換。在.net中,引數型別是協變的。假定有 shape和 rectangle 類,rectangle 派生自shape基類。宣告display 方法是為了接受 shape型別的物件作為其引數 pu...