請問python theano中的shared variable是指什麼意思?


難道重點不是shared可以存儲在顯存中嘛?不知道為啥大家都木有提到這一點。

因為這個特性,我們才會有「把神經網路參數放到shared中」的這種做法。

shared指向顯存中的一塊區域,這塊區域在運算中是共享的,所以常常在運算中用來存儲權值參數。

例如咱經常寫P(x;theta)=balabalabala

x是tensor,因為x是隨輸入變化的

而theta就是shared,因為theta不是輸入,而是被動改變的變數。

雖然x是tensor,但是每次eval時,如果真的輸入一個numpy矩陣,那就太慢了,因為numpy矩陣是存在內存中的。所以常見的做法就是把dataset也用shared變數存起來。然後把切片作為x的數據feed進function。

這時候所有的操作只有指令的流動,而沒有內存顯存數據切換,速度杠杠的。


shared variable是一種符號變數(symbolic variable),但是這個symbolic variable又擁有自己的值。

假設你定義了一個shared variable叫做a:

import theano

a = theano.shared(2, "a")

那麼a就是一個symbolic variable,目前的初始值是2

現在你定義兩個theano.function,一個實現加二的功能,一個實現平方的功能:

i = theano.tensor.scalar("i", dtype=theano.config.floatX)

add_two_func = theano.function(inputs=[i], outputs=[i+a])

sqr_func = theano.function(inputs=[i], outputs=[i**a])

i作為一個輸入變數,通過theano.tensor.scalar來定義。i也是一個symbolic variable,但是它在定義的時候沒有一個固定的值。

現在開始實際調用加二的函數和平方的函數:

&>&>&> add_two_func(3)

[array(5.0)]

&>&>&> sqr_func(4)

[array(16.0)]

i在調用函數的時候,才被賦值。在上例中,i第一次被賦值了3,第二次被賦值了4。而a作為symbolic variable,卻在定義的時候就已經擁有了值:2 。

a之所以叫shared variable是因為a的賦值在不同的函數中都是一致的,即a是被shared的。在上例中a的值在不同的函數中都為2。


你就當是全局變數


共享變數,比如logistic二分類回歸模型,shared變數就是那個參數,看作兩層單節點單輸出神經網路。。推廣下,我說得抽象點,如果這個shared變數是個矩陣,樣本本身還可以由不同的變數表示某種狀態,那麼這個變換後的值是個新的向量,然後再由一次變換輸出為一個值,就是三層神經網。如果這個變換後的向量再由一個矩陣變換為新向量,……就是deep網。那麼這個shared就是這樣的。


推薦閱讀:

Python 最重要的庫都有哪些?
python有木有類似cplusplus cppreference 這種網站?
Python 的庫函數里有沒有現成的全排列函數?
怎樣從零開始用 Python 寫一個貪吃蛇?
python3.5 pip安裝庫,無法找到vcvarsall.bat錯誤?裝VS、改源碼無效

TAG:Python | 編程 | GPU通用計算 | Python庫 |