2016-10-30 6 views
0

Ich bin auf der Suche nach einer Möglichkeit, eine Funktion zu schreiben, die zwei Theano Ausdrücke a und b und tut elementweise Operation (sagen wir Addition) auf ihnen, so dass dimensions(a + b) = dimensions(a) + dimenisons(b).Operation in theano, die immer Dimensionen hinzufügt

In meinem Fall wird a eine Dimension haben und b wird zwei oder drei haben.

Ich dachte über etwas wie a.dimshuffle('x', 'x', 0) + a.dimshuffle(0, 1, 'x') für 2 dimensionale b, aber ich weiß nicht, wie man die Anzahl der Dimensionen davon bekommen. b.shape ist ein Theano-Ausdruck und unterstützt len() nicht.

End Ziel, dies ist ein Abstand von Linienzug an mehreren Punkten zu berechnen, wird diese Technik mehrfach verwendet werden, wo a Form haben (number_of_control_points,) und b werden die 2D- oder 3D-Raster Abtastpunkte sein, bei der Koordinaten ich werde beurteile die Entfernung.

Kann ich die Anzahl der Dimensionen eines Ausdrucks als regulären Python-Wert abrufen, ohne den Ausdruck zu bewerten?

Alternative Frage: Gibt es eine Möglichkeit, die Operation direkt ohne explizite Dim-Swuffle durchzuführen?

Antwort

1

Verwendung tile mit etwas Rundfunk Magie:

import theano as th 
import theano.tensor as T 

def general_outer(elem_op, a, b): 
    a_shape = T.shape(a) 
    b_shape = T.shape(b) 
    return elem_op(T.tile(a, T.join(0,T.ones_like(a_shape),b_shape), b)) #note the broadcast