tf.Variable 和 tf.get_variable的区别(2)
??????? 上上篇博文也寫(xiě)了這個(gè)話(huà)題,這次自己又敲了一下代碼,再次研究了一下關(guān)于tf.Variable()?和?tf.get_variable()?的區(qū)別,?我就先不說(shuō)太多,先直接看看代碼,再來(lái)總結(jié)分析,下面代碼中注釋部分為輸出結(jié)果。
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則會(huì)報(bào)錯(cuò)
????b?=?tf.get_variable('a1')
????print(w.name)??#?aa/a1:0
????不難看出這就是我們常說(shuō)的?作用域共享變量,在同一個(gè)?variable_scope下,如果存在同名變量,tf.Variable()會(huì)自動(dòng)處理,使之不重名,從而不會(huì)報(bào)錯(cuò);tf.get_variable()?則必須聲明?reuse?=?True?。如果在開(kāi)啟reuse=True的一個(gè)變量作用域里面,使用一個(gè)之前定義好的變量作用域,則會(huì)跳過(guò)當(dāng)前變量的作用域,保持預(yù)先存在的作用域不變。?tf.variable_scope?對(duì)op_name?以及?variable_name?都會(huì)被加上域名前綴,eg.?w.name?==?aa/a1,我們?cè)賮?lái)看下一段代碼:
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'
????這段代碼什么都不會(huì)輸出(當(dāng)然沒(méi)有輸出,hh)也不會(huì)報(bào)錯(cuò),?說(shuō)明assert?語(yǔ)句都通過(guò)了。這時(shí)你對(duì) tf.variable_scope?對(duì)op_name?以及?variable_name?都會(huì)被加上域名前綴?這句話(huà)是不是就懂了?另外你應(yīng)該還會(huì)發(fā)現(xiàn)?name_scope?影響?tf.Variable?以及?op_name,不影響tf.get_variable(所謂影響是指是否加上域名前綴)。需要指出的是?name_scope?的作用是為變量劃分范圍,在可視化中,這表示為一個(gè)層級(jí)。下次有時(shí)間說(shuō)說(shuō)?tensorboard?的時(shí)候我們可以細(xì)細(xì)說(shuō)來(lái)。
總結(jié)
以上是生活随笔為你收集整理的tf.Variable 和 tf.get_variable的区别(2)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【Numpy 学习记录】np.stack
- 下一篇: tensorflow数据增强