1. tf.Variable與tf.get_variable
tensorflow提供了通過變量名稱來創(chuàng)建或者獲取一個(gè)變量的機(jī)制盆耽。通過這個(gè)機(jī)制,在不同的函數(shù)中可以直接通過變量的名字來使用變量子眶,而不需要將變量通過參數(shù)的形式到處傳遞。
TensorFlow中通過變量名獲取變量的機(jī)制主要是通過tf.get_variable和tf.variable_scope實(shí)現(xiàn)的。
當(dāng)然,變量也可以通過tf.Varivale來創(chuàng)建戚哎。當(dāng)tf.get_variable用于變量創(chuàng)建時(shí)裸诽,和tf.Variable的功能基本等價(jià)。
tf.get_varialbe和tf.Variable最大的區(qū)別在于:tf.Variable的變量名是一個(gè)可選項(xiàng)建瘫,通過name=’v’的形式給出崭捍。但是tf.get_variable必須指定變量名尸折。??
2. tf.get_variable與tf.variable_scope
上面已經(jīng)提到過了:TensorFlow中通過變量名獲取變量的機(jī)制主要是通過tf.get_variable和tf.variable_scope實(shí)現(xiàn)的啰脚。在這里,我主要解釋下大家深惡痛絕的reuse問題实夹。
其實(shí)只要記住一件事情就ok了:當(dāng)reuse為False或者None時(shí)(這也是默認(rèn)值)橄浓,同一個(gè)tf.variable_scope下面的變量名不能相同;當(dāng)reuse為True時(shí)亮航,tf.variable_scope只能獲取已經(jīng)創(chuàng)建過的變量荸实。
下面我們通過代碼來看下:
在這種情況下會(huì)報(bào)錯(cuò):Variable foo/v already exists, disallowed.Did you mean to set reuse=True in Varscope?
其原因就是在命名空間foo中創(chuàng)建了相同的變量。如果我要在foo下創(chuàng)建一個(gè)變量v1缴淋,其name=‘v’准给,只需要將reuse設(shè)置為Ture就ok了。將上面第二部分代碼修改為:
當(dāng)reuse已經(jīng)設(shè)置為True時(shí)重抖,tf.variable_scope只能獲取已經(jīng)創(chuàng)建過的變量露氮。這個(gè)時(shí)候,在命名空間bar中創(chuàng)建name=‘v’的變量v3钟沛,將會(huì)報(bào)錯(cuò):Variable
bar/v dose not exists, diallowed. Did you mean to set reuse=None in VarScope?
簡(jiǎn)而言之畔规,reuse=False時(shí),tf.variable_scope創(chuàng)建變量恨统;reuse=True時(shí)叁扫,tf.variable_scope獲取變量。
3. tf.variable_scope與tf.name_scope
除了tf.variable_scope畜埋,tf.name_scope函數(shù)也提供了命名空間管理的功能莫绣。這兩個(gè)函數(shù)在大部分情況下是等價(jià)的,唯一的區(qū)別是在使用tf.get_variable函數(shù)時(shí)悠鞍。
tf.get_variable函數(shù)不受tf.name_scope的影響兔综。
我們從代碼看下這句話的具體意思。
首先是tf.variable_scope:
再看tf.name_scope:
從這個(gè)結(jié)果中狞玛,我們能很清晰地看到软驰,tf.get_variable創(chuàng)建的變量并不是a/b:0,而是b:0心肪。這就表示了在tf.name_scope函數(shù)下锭亏,tf.get_variable不受其約束。