2015-10-19 62 views
2

我想問幾個與theano函數有關的問題。我想了解theano函數(給定,更新)

1.我看到沒有分配輸入變量的腳本。如果是這樣,它是如何工作的?

import theano.tensor as T 
import theano 
# Define symbolic variables 
X = T.matrix('X') 
w = theano.shared([0.1, 0.1], name='w') 
t = T.vector('t') 
# Define Loss Expression 
L = (t-X*w)**2 
# Calculate Gradient Expression 
dLdw = T.grad(L, w) 
# Compile the training function 
lr = 0.1 
data_X = theano.shared([[0.1, 0.2], [0.2, 0.3], [0.1, 0.4], [0.2, 0.4]]) 
data_t = theano.shared([3, 3.5, 4, 4.2]) 
calc_output = theano.function([], L, 
    updates=[(w, w - lr*dLdw)], givens=[(X,data_X), (t,data_t)]) 
for epoch in xrange(100): 
calc_output() 

如上所示,輸入方括號爲空。這種情況下輸入什麼呢?

2.當涉及函數中給定的參數時,它有點難以理解。人們說這是爲了推動GPU的進程,但我想知道應該爲「給定」分配什麼樣的變量。 請看下面的腳本。

index = T.scalar('index') 
test_model = theano.function(inputs=[index], 
outputs=classifier.errors(y), 
    givens={ 
     x: test_set_x[index * batch_size: (index + 1) * batch_size], 
     y: test_set_y[index * batch_size: (index + 1) * batch_size]}) 

validate_model = theano.function(inputs=[index], 
    outputs=classifier.errors(y), 
    givens={ 
     x: valid_set_x[index * batch_size:(index + 1) * batch_size], 
     y: valid_set_y[index * batch_size:(index + 1) * batch_size]}) 

在給定的,有什麼x和y呢?什麼冒號(:)意味着什麼?我們知道,(theano主頁上寫道:givens(可迭代Variables對(Var1,Var2))列表,元組或字典,每對中的Var1和Var2必須具有相同的Type。) - 特定替換在計算圖中(Var2代替了Var1)。)它需要2個變量,但在第一個例子和第二個例子中似乎有4個變量對我來說非常複雜。有誰能告訴我具體的細節做了什麼?並解釋給定變量中第二個腳本的內容。

此外,在主頁中,它表示'您可以使用函數的givens參數替換圖中特定節點以實現特定功能。'我沒有得到它所取代的圖表中的哪個節點。

請幫助我!

回答

1

首先,給定意味着什麼是T變量的實際價值。如果在Givens中存在(x,a),並且a是np.array,那麼它將在計算時使用a來代替x,如果存在x:a,那麼它也表示同樣的事情。 在第一個例子中,data_X是輸入,只是沒有在第一個參數中給出,而是在給定中給出,這是相同的。 在第二個示例中,test_set_x是theano.shared,意思是它的值已經存在,它是一個矩陣。但是你會使用哪一部分,你將通過索引來選擇哪個是輸入。

+0

感謝您的評論,這真的很有幫助,請檢查我是否理解你說的。在第一個例子中,給定data_x將被輸入並用其輸出替換X(data_x經過'L'等式:(tX * w)** 2),然後用其輸出替換x),並且這個替換也發生在data_t處,因爲L需要data_x和data_t。 –

+0

在第二個例子中,有兩個冒號。在第一個給定的'x:valid_set_x [index * batch_size:(index + 1)* batch_size'中,這是(valid_set_x [index * batch_size:(index + 1)* batch_size)輸入,'x'被替換爲一個嗎?它很混亂,因爲輸入已被分配:input = ['index']。我沒有得到這個'index * batch_size:(index + 1)* batch_size'部分是什麼......比方說batch_sizeis是100,那麼它意味着'test_set_x [100:200]',所以把它替換成x後的test_set_x通過輸出:classifier.errors? –

+0

我還看到只有1個集合變量,如給定= [x,a],這意味着任意數量的集合(3集或更多集像給定= [x,a],[y,b],[z,c ])可以嗎? –