您當前的位置:首頁 > 收藏

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

作者:由 LoYr 發表于 收藏時間:2017-04-26

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

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

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

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

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

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

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

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

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

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

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

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

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

2)變數共享

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

1。tf。get_variable()

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

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

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

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

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

這兩個都是建立一個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:

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

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

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

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

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

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

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

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

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

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

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

部落格首發地址

標簽: 變數  tf  variable  建立  get