2016-11-29 15 views
0

我對theano.scan()感到困惑。我已閱讀官方文件,但我仍然覺得我的知識是有限的。我想更改theano.scan中給出的功能的輸入。例如,我有以下代碼。如何更改theano.scan()中給出的函數的輸入?

def forward_prop_step(x_t, s_t1_prev, s_t2_prev): 
    # i have my code here 

[o, s, s2], updates = theano.scan(
      forward_prop_step, 
      sequences=x, 
      truncate_gradient=self.bptt_truncate, 
      outputs_info=[None, 
          dict(initial=T.zeros(self.hidden_dim)), 
          dict(initial=T.zeros(self.hidden_dim))]) 

所以,在這裏theano.scan在序列x運行。據我所知,forward_prop_step得到輸入x_ttheano.scan經歷序列x但如何forward_prop_step得到第二個和第三個參數?是theano.scanoutputs_info的第二個和第三個值獲取第二個和第三個參數?

如果我想修改上面的代碼,並且想給一個更多的參數x2作爲theano.scan的序列,應該如何修改代碼?我想theano.scan運行兩個序列xx2,並給出它們的值作爲forward_prop_step方法的前兩個參數(xx2)。例如,forward_prop_step原型將是:

def forward_prop_step(x_t, x_f, s_t1_prev, s_t2_prev): 
    # i have my code here 

我怎樣才能改變theano.scan上述代碼給兩個xx2爲序列?任何人都可以簡單解釋一下,我怎樣才能改變給予theano.scan函數的參數以及帶有例子的返回值?

幾個其他的問題

(1)如果我給n_steps參數與sequences參數一起,怎麼theano.scan執行?那麼theano.scan就像嵌套(兩個)for循環一樣工作? (2)theano.scan函數的參數non_sequencessequences有什麼不同?

(3)theano.scan是否爲序列參數的每個元素調用提供的函數?如果是這樣,那麼當我在forward_prop_step函數內寫入print語句時,雖然執行多次函數內部的計算(通過整個序列),但只執行一次print語句。 theano.scan如何反覆調用提供給它的方法?

回答

2

theano.scanoutputs_info的第二個和第三個值獲取第二個和第三個參數?

- >是的,如果一個元素outputs_info不是None這意味着它是一個經常性輸出,因此必須傳遞給step函數。

如果我想修改上面的代碼,並且想給出多一個參數x2作爲theano.scan的序列,應該如何修改代碼?

- >你只需要包含x2到序列的列表

[o, s, s2], updates = theano.scan(
     forward_prop_step, 
     sequences=[x, x2], 
     truncate_gradient=self.bptt_truncate, 
     outputs_info=[None, 
         dict(initial=T.zeros(self.hidden_dim)), 
         dict(initial=T.zeros(self.hidden_dim))]) 

參數出現在step功能的順序是(元素):sequencesoutputs_infonon_sequences(僅當它們是在scan中指定)。

(1)如果我給n_steps參數以及sequences參數,theano.scan如何執行?那麼theano.scan就像嵌套(兩個)for循環一樣工作?

如果n_steps被提供scan只會迭代這些迭代次數。如果迭代的張量的第一維有10個元素,並且n_steps4,那麼掃描只會迭代該張量的前4個「元素」。它不會像嵌套循環一樣工作。 (2)參數non_sequences與theano.scan函數參數中的序列有什麼不同?

non_sequences不受scan在迭代,他們只是提到的代碼清晰,因爲他們的step函數中使用,顯然scan可以在它自己找出他們,因此他們只是可選的,而不是強制性的(雖然推薦)。相反,sequences指定變量scan應循環循環。

(3)theano.scan是否爲序列參數的每個元素調用提供的函數?如果是這樣,那麼當我在forward_prop_step函數內寫入print語句時,雖然執行多次函數內部的計算(通過整個序列),但只執行一次print語句。 theano.scan如何反覆調用提供給它的方法?

theano.scan立即在sequences[]內迭代每個元素的第一維,並且在每次迭代期間它將調用step函數。如果您想打印scan中的中間計算,則應使用theano.printing.Print(有關詳細信息,請參閱this鏈接)。原因print語句只被執行一次是因爲Theano的工作方式是在掃描代碼時構建計算圖,之後只有該計算圖使用各自的值執行,python的print不能成爲theano計算圖的一部分因此你只能看到它一次。

我建議你仔細看看documentationthis教程。

+0

感謝兄弟您簡短的回答,我真的很感激。我在帖子中增加了一個問題(第三個問題),你能否也回答這個問題?我已閱讀文檔,但無法理解theano.scan如何迭代調用函數? –

+0

非常感謝,兄弟! –

+0

我很高興,它幫助 – uyaseen

相關問題