請問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 theanoa = 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、改源碼無效