Grundlegende 1d-Faltung im Tensorfluss

9

OK, ich möchte eine eindimensionale Faltung von Zeitreihendaten in Tensorflow machen. Dies wird anscheinend unterstützt mit tf.nn.conv2d , nach diesen Tickets und Handbuch . Die einzige Voraussetzung ist strides=[1,1,1,1] zu setzen. Klingt einfach!

Allerdings kann ich nicht einmal in einem sehr minimalen Testfall herausfinden, wie das geht. Was mache ich falsch?

Lass es uns einrichten.

%Vor%

OK, erzeugen Sie jetzt einen grundlegenden Faltungstest auf zwei kleinen Arrays. Ich werde es leicht machen, indem ich eine Stapelgröße von 1 verwende, und da Zeitreihen 1-dimensional sind, werde ich eine "Bildhöhe" von 1 haben. Und da es eine univariate Zeitreihe ist, ist auch die Anzahl der "Kanäle" 1, also wird das einfach sein, oder?

%Vor%

BOOM. Fehler.

%Vor%

OK, Zunächst einmal verstehe ich nicht, wie dies mit any Dimensionen geschehen soll, da ich angegeben habe, dass ich die Argumente im Faltungs-OP auffüllen soll.

aber gut, vielleicht sind dem Grenzen gesetzt. Ich muss die Dokumentation durcheinandergebracht haben und diese Faltung auf den falschen Achsen des Tensors aufbauen. Ich werde alle möglichen Permutationen versuchen:

%Vor%

Ergebnis:

%Vor%

Hmm. OK, es scheint jetzt zwei Probleme zu geben. Erstens, die ValueError bezieht sich auf das Anwenden des Filters entlang der falschen Achse, ich denke, obwohl es zwei Formen gibt.

Aber die Achsen, auf denen ich den Filter anwenden kann, sind auch verwirrend - beachte, dass er den Graphen mit der Eingabeform (5, 1, 1, 1) und der Filterform (1, 1, 1, 3) konstruiert. AFAICT aus der Dokumentation sollte dies ein Filter sein, der sich beispielsweise aus dem Batch, einem "Pixel" und einem "Channel" anschaut und 3 "Channels" ausgibt. Warum funktioniert das, wenn andere es nicht tun?

Wie auch immer, manchmal schlägt es beim Erstellen des Graphen nicht fehl. Irgendwann konstruiert es den Graphen; dann erhalten wir tensorflow.python.framework.errors.InvalidArgumentError . Von einigen verwirrenden GitHub-Tickets nehme ich an, dass dies wahrscheinlich auf die Tatsache zurückzuführen ist, dass ich auf CPU laufe anstelle von GPU, oder umgekehrt die Tatsache, dass die Faltung Op nur für 32-Bit-Floats, nicht 64-Bit-Floats definiert ist. Wenn jemand etwas Licht auf welche Achsen werfen könnte, sollte ich was ausrichten, um eine Zeitreihe mit einem Kernel zu falten, wäre ich sehr dankbar.

    
dan mackinlay 30.06.2016, 05:20
quelle

3 Antworten

17

Es tut mir leid, das zu sagen, aber Ihr erster Code war fast richtig. Sie haben nur x und phi in tf.nn.conv2d umgekehrt:

%Vor%

Update: TensorFlow unterstützt nun die 1D-Faltung seit Version r0.11 unter Verwendung von tf.nn.conv1d . Ich habe vorher eine Anleitung erstellt, um sie in der Stackoverflow-Dokumentation zu verwenden (jetzt ausgestorben), die ich hier einfügen möchte:

Anleitung zur 1D Faltung

Betrachten Sie ein einfaches Beispiel mit einer Eingabe der Länge 10 und der Dimension 16 . Die Stapelgröße ist 32 . Wir haben daher einen Platzhalter mit der Eingabeform [batch_size, 10, 16] .

%Vor%

Wir erstellen dann einen Filter mit der Breite 3, und wir nehmen 16 channels als Eingabe und geben auch 16 channels aus.

%Vor%

Schließlich wenden wir tf.nn.conv1d mit einem Schritt und einem Padding an: - Schritt : Ganzzahl s - padding : das funktioniert wie in 2D, Sie können zwischen SAME und VALID wählen. SAME gibt die gleiche Eingabelänge aus, während VALID keine Nullfüllung hinzufügt.

Für unser Beispiel nehmen wir eine Schrittweite von 2 und eine gültige Füllung.

%Vor%

Die Ausgabeform sollte [batch_size, 4, 16] sein.
Mit padding="SAME" hätten wir eine Ausgabeform von [batch_size, 5, 16] gehabt.

    
Olivier Moindrot 30.06.2016, 08:02
quelle
2

Ich glaube, ich habe es mit den Anforderungen, die ich brauchte, arbeiten lassen. Die Kommentare / Details, wie es funktioniert, sind auf den Code:

%Vor%

danke Olivier für die Hilfe (siehe die Diskussion in seinen Kommentaren zur weiteren Klärung).

Überprüfen Sie es manuell:

%Vor%

Ausgänge:

%Vor%     
Pinocchio 09.08.2016 18:15
quelle
2

In den neuen Versionen von TF (ab 0.11) gibt es conv1d , also dort Es ist nicht notwendig, die 2d-Faltung zu verwenden, um 1d Faltung durchzuführen. Hier ist ein einfaches Beispiel für die Verwendung von conv1d:

%Vor%

Um zu verstehen, wie conv1d berechnet wird, werfen Sie einen Blick auf verschiedene Beispiele

    
Salvador Dali 20.05.2017 22:56
quelle

Tags und Links