2017-03-22 4 views
0

Ich benutze Keras mit einem Theano-Backend. Jetzt habe ich eine Variable x, die ein Theano-Tensor mit einem Typfeld "TensorType (float32, 3D)" ist.
Ich habeWarum ändert Keras Funktion "expand_dims" den Typ?

from keras import backend as K 

am Anfang meiner Datei. Dann schrieb ich:

x = K.expand_dims(x, dim = 1) 

ich erwartet, dass das Typ-Feld von x sein sollte "TensorType (float32, 4D)". Es ist jedoch "TensorType (float32, (False, True, False, False))", und ich kann den Grund nicht herausfinden. Außerdem enthält das Keras-Dokument keine weiteren Informationen zu dieser Funktion, es heißt lediglich, dass "eine 1-dimensionale Dimension am Index" dim "" hinzugefügt wird.
Außerdem, wenn I

x = K.squeeze(x, 1) 

zuführen, wird das Typfeld von x "TensorType (float32, Matrix)", die erwartet wird.

Antwort

1

Der Befehl expand_dims hat dimshuffle Betrieb von Theano unter der Haube. Das Tupel (False, True, False, False) teilt Ihnen die übertragbaren Dimensionen mit. Sie können sich der Übertragungsfähigkeiten von Numpy bewusst sein. Es ist ähnlich mit einigen wichtigen Unterschieden.

Von Theano-Entwickler: Theano muss alle übertragbaren Dimensionen in der Grafik vor der Kompilierung deklariert werden. NumPy verwendet die Informationen zur Laufzeitform.

Weitere Details finden Sie unter this und this.

Im Falle Ihres 4-D-Arrays ist die zweite Dimension, d. H. Kanäle, übertragbar. Nehmen wir an, dass Ihre 4-D-Array-Größe (10,N,20,30) ist. Jetzt können Sie eine elementweise Multiplikation Ihres 4-D-Arrays und eines anderen Arrays der Größe (10,1,20,30) ohne Wiederholung der zweiten Dimension N mal durchführen. Dies wird Rundfunk genannt. Jetzt versuchen Sie, Ihre 4-D-Array und ein anderes Array der Größe (1,N,20,30) zu multiplizieren. Dies wird fehlschlagen, da die erste Dimension nicht übertragbar ist. Ich hoffe, das ist klar.

+0

Ich verstehe den Übertragungsmechanismus. In der Tat versuche ich einen Tensor von 'TensorType (float32, 4D)' zu einem Tensor von 'TensorType (float32, 3D)' zu drücken, mache etwas darauf und stelle ihn auf einen Tensor von 'TensorType (float32, 4D)) '. Allerdings kann ich es einfach auf einen Tensor von 'TensorType (float32, (False, True, False, False))' zurückstellen, und ich frage mich, wie ich es auf einen Tensor von 'TensorType (float32, 4D)' zurückstellen kann. – ptr

Verwandte Themen