2014-11-03 7 views
9

मैं theano.scan() के व्यवहार को पूरी तरह से समझ नहीं सकता।पायथन - थानो स्कैन() फ़ंक्शन

import numpy as np 
import theano 
import theano.tensor as T 


def addf(a1,a2): 
     return a1+a2 

i = T.iscalar('i') 
x0 = T.ivector('x0') 
step= T.iscalar('step') 

results, updates = theano.scan(fn=addf, 
        outputs_info=[{'initial':x0, 'taps':[-2]}], 
        non_sequences=step, 
        n_steps=i) 

f=theano.function([x0,i,step],results) 

print f([1,1],10,2) 

ऊपर टुकड़ा निम्न क्रम प्रिंट, जो पूरी तरह से उचित है:

[ 3 3 5 5 7 7 9 9 11 11] 

लेकिन अगर मैं से -2 -1 नल सूचकांक स्विच, यानी

यहाँ एक उदाहरण है

outputs_info=[{'initial':x0, 'taps':[-1]}] 

परिणाम हो जाता है:

[[ 3 3] 
[ 5 5] 
[ 7 7] 
[ 9 9] 
[11 11] 
[13 13] 
[15 15] 
[17 17] 
[19 19] 
[21 21]] 
बजाय मुझे क्या उचित प्रतीत होता है की

(बस वेक्टर का अंतिम मान लेने के लिए और 2 जोड़ने):

[ 3 5 7 9 11 13 15 17 19 21] 

किसी भी मदद की बहुत सराहना की जाएगी।

धन्यवाद!

उत्तर

10

जब आप टैप्स = [- 1] का उपयोग करते हैं, तो स्कैन करें कि आउटपुट जानकारी की जानकारी का उपयोग इस प्रकार किया जाता है। इसका मतलब है कि एडीएफ फ़ंक्शन को वेक्टर और गैर-परिणाम के रूप में इनपुट के रूप में बुलाया जाएगा। आप एक अदिश को x0 परिवर्तित करते हैं, तो यह आपकी अपेक्षा के अनुसार काम करेगा:

import numpy as np 
import theano 
import theano.tensor as T 


def addf(a1,a2): 
     print a1.type 
     print a2.type 
     return a1+a2 

i = T.iscalar('i') 
x0 = T.iscalar('x0') 
step= T.iscalar('step') 

results, updates = theano.scan(fn=addf, 
        outputs_info=[{'initial':x0, 'taps':[-1]}], 
        non_sequences=step, 
        n_steps=i) 

f=theano.function([x0,i,step],results) 

print f(1,10,2) 

यह इस उत्पादन दे:

TensorType(int32, scalar) 
TensorType(int32, scalar) 
[ 3 5 7 9 11 13 15 17 19 21] 

आपके मामले में के रूप में यह addf (वेक्टर, अदिश) करते हैं, इसे प्रसारित elemwise मूल्य।

टैप [-1] होने पर, किसी अन्य तरीके से समझाया गया है, x0 आंतरिक कार्य में "जैसा है" पारित किया जाएगा। यदि नल में कुछ और होता है, तो आंतरिक फ़ंक्शन को जो पास किया जाता है, उसके बाद 1 आयाम x0 कम होगा, क्योंकि x0 को कई प्रारंभिक चरण मान (-2 और -1) प्रदान करना होगा।

संबंधित मुद्दे