2016-11-03 2 views
0

Theano unterstützt keine Indexzuweisung. Okay, aber es gibtIndex-Wert einem einzelnen Element in der Tensorvariablen zuweisen

theano.tensor.set_subtensor(x,y) 

und es ist stated dass

Wenn Sie so etwas wie ein [5] = b tun wollen oder [5] + = b, siehe theano.tensor. set_subtensor() und theano.tensor.inc_subtensor() unten.

So simuliert Set_subtensor Index-Zuweisung Operationen? Nicht ganz. set_subtensor, scheint nur wie erwartet zu funktionieren, wenn ndims < 2, wie im folgenden Beispiel zu sehen ist.

>>> a = theano.tensor.zeros(10) 
>>> a.eval() 
array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32) 
>>> aa = theano.tensor.set_subtensor(a[5], 5.0) 
>>> aa.eval() 
array([ 0., 0., 0., 0., 0., 5., 0., 0., 0., 0.], dtype=float32) 

cool, a.shape == aa.shape kann a = aa gesetzt a [5] = 5,0 zu replizieren ist es dann mit mehr dims versuchen lassen.

>>> b = theano.tensor.zeros((5,5)) 
>>> b.eval() 
array([[ 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0.]], dtype=float32) 
>>> bb = theano.tensor.set_subtensor(b[2][2], 5.0) 
>>> bb.eval() 
array([ 0., 0., 5., 0., 0.], dtype=float32) 
>>> bb.shape.eval() 
array([5]) 

Während set_subtensor den angegebenen Wert in dem Zielindex vergebenen es gibt nicht die den gesamten aktualisierten Tensor variabel, sondern nur die subtensor mit dem aktualisierten Wert.

Kann jemand Werte zu einzelnen Elementen in den Tensoren mit ndims> = 2 indizieren?

Antwort

0

Konnte es herausfinden. Um Werte für einzelne Elemente in einem Tensor mit ndims> = 2 indizieren zu können, müssen Sie den Subtensor rekursiv mit dem aktualisierten Wert auf die Dims setzen. Zum Beispiel:

>>> b = theano.tensor.zeros((5,5)) 
>>> b.eval() 
array([[ 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0.]], dtype=float32) 
>>> bb = theano.tensor.set_subtensor(b[2][2], 5.0) 
>>> bb.eval() 
array([ 0., 0., 5., 0., 0.], dtype=float32) 
>>> b = theano.tensor.set_subtensor(b[2], bb) 
>>> b.eval() 
array([[ 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0.], 
     [ 0., 0., 5., 0., 0.], 
     [ 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0.]], dtype=float32) 

Mit ndims = 3

>>> c = theano.tensor.zeros((2,2,2)) 
>>> c.eval() 
array([[[ 0., 0.], 
     [ 0., 0.]], 

     [[ 0., 0.], 
     [ 0., 0.]]], dtype=float32) 
>>> ccc = theano.tensor.set_subtensor(c[0][0][0], 5.0) 
>>> ccc.eval() 
array([ 5., 0.], dtype=float32) 
>>> cc = theano.tensor.set_subtensor(c[0][0], ccc) 
>>> cc.eval() 
array([[ 5., 0.], 
     [ 0., 0.]], dtype=float32) 
>>> c = theano.tensor.set_subtensor(c[0], cc) 
>>> c.eval() 
array([[[ 5., 0.], 
     [ 0., 0.]], 

     [[ 0., 0.], 
     [ 0., 0.]]], dtype=float32) 

Vielleicht gibt es einen einfacheren/schneller Weg zum Index-assign, aber das ist, was ich gefunden habe.

Verwandte Themen