2014-11-03 4 views
9

Ich kann das Verhalten von theano.scan() nicht vollständig verstehen.Python - Theano scan() Funktion

Hier ist ein Beispiel:

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) 

Die obigen Schnipsel die folgende Sequenz, die durchaus sinnvoll ist:

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

Allerdings, wenn ich den Hahn Index von -2 bis -1, dh schalt

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

Das Ergebnis wird:

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

statt, was mir scheint vernünftig (nehmen Sie nur den letzten Wert des Vektors und fügen 2):

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

Jede Hilfe sehr geschätzt würde.

Danke!

Antwort

10

Wenn Sie tipps = [- 1] verwenden, scannen Sie, dass die Informationen in der Ausgabeinformation so verwendet werden, wie sie sind. Das bedeutet, dass die addf-Funktion mit einem Vektor und der non_sequence als Eingaben aufgerufen wird. Wenn Sie x0 auf einen Skalar konvertieren, wird es wie erwartet:

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) 

Dies diesen Ausgang geben:

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

In Ihrem Fall, da es ADDF tun (Vektor, Skalar), übertragen sie die elementarer Wert.

Auf eine andere Weise erklärt, wenn Abgriffe [-1] ist, wird x0 "wie es ist" an die innere Funktion übergeben. Wenn taps etwas anderes enthalten, wird das, was an die innere Funktion übergeben wird, eine Dimension kleiner als x0 haben, da x0 viele Anfangsschritte (-2 und -1) liefern muss.