1. 程式人生 > >羅斯基白話:TensorFlow+實戰系列(四)變數管理

羅斯基白話:TensorFlow+實戰系列(四)變數管理

白話TensorFlow +實戰系列(一)
變數管理

       這篇文章主要記錄常用的兩種管理變數的方法。個人感覺變數管理是比較重要的,特別是當建立一個複雜的神經網路的時候,變數一旦增多,如果不好好管理這些變數,程式碼的可讀性會變得比較差,到最後可能自己都不知道變數到底指的是啥。所以,這次總結了兩種常用的管理變數方法。

1)基於字典的方法建立變數

       這種方法其實就是用字典的方式,key就是你取的網路層名字,value就是神經網路各層的變數。如要建立有兩個隱藏層的神經網路,各層的變數可由如下程式碼管理:


其中layer1表示的是輸入層到第一層隱藏層的變數

layer2表示第一層隱藏層到第二層隱藏層的變數

out表示第二層隱藏層到輸出層的變數

這樣我們就將各層的變數通過字典的形式封裝起來,當構建神經網路的時候,我們可以直接呼叫,示例如下:


如圖通過直接呼叫w["layer1"]就可以獲取layer1的權重,以此類推。

這樣就成功的建立了一個全連線神經網路

2)變數共享

TensorFlow提供了一種更簡單的方法管理變數,即變數共享。該方法主要是通過tf.get_variable()與tf.variable_scope()函式來實現。下面分別說說怎麼用

1.tf.get_variable()

該函式可以用於建立變數,也可以用於獲取已經建立的變數。

當用於建立變數的時候,他的作用與tf.Variable()可以理解成一樣,只是引數的設定位置不同而已。

如圖,以下這兩個變數建立的形式一樣:


這兩個都是建立一個2*3的張量,不同的是,tf.Variable()張量名稱這個引數是可選的,tf.get_variable()是必填的,並且tf.get_variable()是用initializer= ....來初始化張量的型別。

其中tf.random_normal_initializer()初始化函式只是在tf.random_normal後面加個initializer()而已,其他的如tf.constant也是加個變成 tf.constant_initializer(),其他相似的函式類似,就不一一列舉。

當需要用tf.get_variable()獲取變數時,就需要通過tf.variable_scope()來建立一個上下文管理器,這個函式包含一個reuse引數,是一個布林型引數,當reuse= True

時,指明在該管理器中,tf.get_variable()用於獲取已經建立的變數;當reuse = False時,指明在該管理器中,tf.get_variable()用於建立變數。

如圖,在名稱空間foo中建立一個變數v1:


接著在名稱空間foo中獲取變數v1:


列印結果為True,表明已經獲取到之前建立的v1。

接下來用變數共享的方法來建立之前的神經網路,程式碼如下:


這樣程式碼的可讀性會比較強。

當需要用訓練好的網路時,直接呼叫network(x_input, reuse = True)即可。