2016-03-21 10 views
5

sto imparando Theano ora, ma ci sono sempre un certo codice problems.my è il seguente:Perchè non posso usare theano.tensor.argmax e theano.tensor.mean correttamente

import theano 
from numpy import * 
import theano.tensor as T 
a = [1,2,3,4] 
b = [7,8,9,10] 
print T.argmax(a) 

ho pensato che sarebbe stampare l'indice di '4', ma il risultato è il seguente:.

argmax 

per di più, quando sto usando T.neq() come segue:

import theano 
from numpy import * 
import theano.tensor as T 
a = [1,2,3,4] 
b = [7,8,9,10] 
print T.neq(a,b) 

la r isultato mostra:

Elemwise{neq,no_inplace}.0 

ho veramente nuovo a questo e non hanno idea, Mi sono perso qualcosa vi ringrazio in anticipo ..

risposta

5

T.argmax() si aspetta un tipo Theano TensorVariable?. Alcuni dei tipi di Variabili utilizzati in Theano sono elencati nello here. Non lasciare che il nome "costruttori completamente dattilografati" ti spaventi. Pensaci più in termini di tipo di dati che vuoi utilizzare come input. Stai usando le matrici float? Quindi il tipo TensorVariable rilevante è probabilmente "fmatrix". Hai a che fare con lotti di dati immagine RGB? Quindi il tipo TensorVariable rilevante è probabilmente "tensor4".

Nel codice, stiamo cercando di inserire un tipo di lista in T.argmax(). Quindi dal punto di vista sopra, non funzionerà. Inoltre, si noti che il tipo (T.argmax (a)) è un tipo theano.tensor.var.TensorVariable. Quindi si aspetta un TensorVariable come input e produce anche un tipo TensorVariable. Quindi questo non restituirà l'attuale argmax.

Ok, quindi cosa funziona? Come possiamo fare questo calcolo in Theano?

Iniziamo a identificare il tipo di dati che si desidera gestire. Questo sarà il punto di partenza del nostro grafico computazionale che costruiremo. In questo caso, sembra che vogliamo gestire array o vettori. Theano ha un tipo ivector, che è un vettore di numeri interi o un tipo fvector che è un vettore di valori float32. Restiamo con i tuoi dati e fare IVector dal momento che abbiamo valori interi:

x = T.ivector('input') 

Questa linea appena creato un x TensorVariable che rappresenta il nostro tipo di ingresso previsto, un array di interi.

Ora definiamo un TensorVariable per l'argmax degli elementi di x:

y = T.argmax(x) 

Finora abbiamo costruito un grafico computazionale, che si aspetta un array di interi come input e in uscita l'argmax di che array. Tuttavia, al fine di fare in realtà questo, dobbiamo compilare questo in una funzione:

get_argmax = theano.function([x], y) 

La sintassi theano.function può essere trovato here.

Pensa a questa funzione come ora sta effettivamente eseguendo il calcolo che abbiamo definito usando x e y.

Quando eseguo:

get_argmax([1,2,3,4,19,1]) 

Restituisce:

array(4) 

Allora cosa abbiamo davvero fare? Definendo le variabili di Theano e utilizzando le funzioni di theano.tensor, costruiamo un grafico computazionale. Abbiamo quindi utilizzato theano.function per compilare una funzione che esegue effettivamente il calcolo sugli input effettivi che specifichiamo.

Per terminare: come eseguire l'operazione di non uguaglianza?

a = T.ivector('a') 
b = T.ivector('b') 
out = T.neq(a,b) 
get_out = theano.function([a,b], out) 
print get_out([1,2,3,4], [7,8,9,10]) 

sarà di ritorno:

[1,1,1,1] 

Una delle differenze concettuali chiave è che io tratto l'a, b come TensorVariables Theano, anziché assegnare loro variabili esplicite.

Si ottiene il blocco, ricorda solo che è necessario definire il tuo calcolo in termini di Teano TensorVariables, e quindi per "usarlo" effettivamente devi compilarlo usando theano.function.

+0

grazie mille! – Chris

Problemi correlati