2014-11-03 18 views
9

Non riesco a comprendere appieno il comportamento di theano.scan().Python - Funzione Theano scan()

Ecco un esempio:

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) 

che questo frammento di stampa la seguente sequenza, che è perfettamente ragionevole:

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

Tuttavia se passo l'indice rubinetto da -2 a -1, cioè

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

Il risultato diventa:

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

invece di quello che sembrerebbe ragionevole per me (basta prendere l'ultimo valore del vettore e aggiungere 2):

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

Qualsiasi aiuto sarebbe molto apprezzato.

Grazie!

risposta

10

Quando si utilizzano i tasti = [- 1], si supponga che le informazioni nelle informazioni di output vengano utilizzate così come sono. Ciò significa che la funzione addf verrà chiamata con un vettore e la non_sequence come input. Se si converte x0 ad uno scalare, funzionerà come ci si aspetta:

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) 

Questo danno questa uscita:

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

Nel tuo caso come fare ADDF (vettore, scalare), è in onda la valore elemwise.

Spiegato in un altro modo, se i tocchi sono [-1], x0 sarà passato "come è" alla funzione interna. Se i tocchi contengono qualcos'altro, ciò che viene passato alla funzione interna avrà 1 dimensione in meno di x0, poiché x0 deve fornire molti valori di passi iniziali (-2 e -1).