tf.Variable 和 tf.get_variable的区别(2)
??????? 上上篇博文也寫了這個話題,這次自己又敲了一下代碼,再次研究了一下關于tf.Variable()?和?tf.get_variable()?的區別,?我就先不說太多,先直接看看代碼,再來總結分析,下面代碼中注釋部分為輸出結果。
with?tf.variable_scope('aa')?as?scope:
????w?=?tf.get_variable("a1",?[1,?2])
????var?=?tf.Variable([0],?name='var1',?dtype=tf.float32)
????va?=?tf.Variable([0],?name='var1',?dtype=tf.float32)
????print(w.name)???#?aa/a1:0
????print(var.name)??#?aa/var1:0
????print(va.name)??#?aa/var1_1:0
with?tf.variable_scope('aa',?reuse=True):??#?如果?reuse=False則會報錯
????b?=?tf.get_variable('a1')
????print(w.name)??#?aa/a1:0
????不難看出這就是我們常說的?作用域共享變量,在同一個?variable_scope下,如果存在同名變量,tf.Variable()會自動處理,使之不重名,從而不會報錯;tf.get_variable()?則必須聲明?reuse?=?True?。如果在開啟reuse=True的一個變量作用域里面,使用一個之前定義好的變量作用域,則會跳過當前變量的作用域,保持預先存在的作用域不變。?tf.variable_scope?對op_name?以及?variable_name?都會被加上域名前綴,eg.?w.name?==?aa/a1,我們再來看下一段代碼:
with?tf.variable_scope('foo'):
????with?tf.name_scope('bar'):
????????v?=?tf.get_variable('v',?[1])
????????b?=?tf.Variable([2],?name='b')
????????w?=?1.0?+?v
print(w.name)
assert?v.name?==?'foo/v:0'
assert?b.name?==?'foo/bar/b:0'
assert?w.name?==?'foo/bar/add:0'
????這段代碼什么都不會輸出(當然沒有輸出,hh)也不會報錯,?說明assert?語句都通過了。這時你對 tf.variable_scope?對op_name?以及?variable_name?都會被加上域名前綴?這句話是不是就懂了?另外你應該還會發現?name_scope?影響?tf.Variable?以及?op_name,不影響tf.get_variable(所謂影響是指是否加上域名前綴)。需要指出的是?name_scope?的作用是為變量劃分范圍,在可視化中,這表示為一個層級。下次有時間說說?tensorboard?的時候我們可以細細說來。
總結
以上是生活随笔為你收集整理的tf.Variable 和 tf.get_variable的区别(2)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Numpy 学习记录】np.stack
- 下一篇: tensorflow数据增强