2013-04-10 59 views
25

在編譯theano中的函數時,可以通過指定updates=[(X, new_value)]來更新共享變量(比如X)。 現在我想更新共享變量的唯一子集:如何在Theano中分配/更新張量共享變量的子集?

from theano import tensor as T 
from theano import function 
import numpy 

X = T.shared(numpy.array([0,1,2,3,4])) 
Y = T.vector() 
f = function([Y], updates=[(X[2:4], Y)] # error occur: 
             # 'update target must 
             # be a SharedVariable' 

的代碼將引發一個錯誤「更新的目標必須是SharedVariable」,我想這意味着更新的目標不能是不共享變量。那麼有沒有什麼辦法可以編譯一個函數來僅僅使用共享變量的子集呢?

回答

0

此代碼應解決您的問題:

from theano import tensor as T 
from theano import function, shared 
import numpy 

X = shared(numpy.array([0,1,2,3,4], dtype='int')) 
Y = T.lvector() 
X_update = (X, X[2:4]+Y) 
f = function(inputs=[Y], updates=[X_update]) 
f([100,10]) 
print X.get_value() 
# output: [102 13] 

這裏是introduction about shared variables in the official tutorial

請問,如果您還有其他問題!

32

使用set_subtensorinc_subtensor

from theano import tensor as T 
from theano import function, shared 
import numpy 

X = shared(numpy.array([0,1,2,3,4])) 
Y = T.vector() 
X_update = (X, T.set_subtensor(X[2:4], Y)) 
f = function([Y], updates=[X_update]) 
f([100,10]) 
print X.get_value() # [0 1 100 10 4] 

現在有一個關於這個頁面中Theano FAQ:http://deeplearning.net/software/theano/tutorial/faq_tutorial.html

+0

+1救了我的一天。謝謝! – displayname 2014-06-15 15:09:04

+1

並更新非連續值:'X_update =(X,T.set_subtensor(X [[2,4]],Y))' – 2015-01-07 14:55:14

+2

[Here](http://deeplearning.net/software/theano/tutorial/ faq_tutorial.html)它表示'inc_subtensor'優先於'set_subtensor' – Kirbies 2015-08-03 12:46:23