Eingabe Dimensionen zu einem eindimensionalen Faltungsnetz in Keras

Wirklich finde es schwer zu verstehen, die Eingabe-Dimensionen auf die Faltung 1d Schicht in Keras:

Eingabeform

3D-Tensor mit Form: (Proben, Stufen, input_dim).

Ausgabeform

3D-Tensor mit Form: (Proben, new_steps, nb_filter). Schritten Wert könnte sich aufgrund von Polsterung geändert haben.

Ich möchte, dass mein Netzwerk eine Zeitreihe von Preisen einnimmt (101, in Reihenfolge) und 4 Wahrscheinlichkeiten ausgeben. Mein aktuelles, nicht faszinierendes Netzwerk, das das recht gut macht (mit einem Trainings-Set von 28000) sieht so aus:

standardModel = Sequential() standardModel.add(Dense(input_dim=101, output_dim=100, W_regularizer=l2(0.5), activation='sigmoid')) standardModel.add(Dense(4, W_regularizer=l2(0.7), activation='softmax')) 

Um dies zu verbessern, möchte ich eine Feature-Map aus der Eingabeschicht machen, die ein lokales Empfangsfeld der Länge 10 hat (und hat daher 10 gemeinsame Gewichte und 1 gemeinsame Bias). Ich möchte dann max Pooling und füttere dies in eine versteckte Schicht von 40 oder so Neuronen und dann Ausgabe mit 4 Neuronen mit Softmax in der äußeren Schicht.

Bild (es ist sehr schrecklich!)

Idealerweise würde die Faltungsschicht einen 2d-Tensor von Dimensionen nehmen:

(Minibatch_size, 101)

Und einen 3D-Tensor von Dimensionen ausgeben

(Minibatch_size, 91, no_of_featuremaps)

Allerdings scheint die keras-Schicht eine Dimension in der Eingabe zu nennen, die Schritt genannt wird. Ich habe versucht, das zu verstehen und noch nicht ganz zu bekommen. In meinem Fall sollte Schritt 1 sein, da jeder Schritt im Vektor eine Zunahme der Zeit um 1 ist? Auch was ist new_step?

Darüber hinaus, wie drehen Sie die Ausgabe der Pooling-Layer (ein 3D-Tensor) in den Eingang passend für die Standard-versteckte Schicht (dh eine Dense-Keras-Schicht) in Form eines 2d-Tensors?

Update: Nach den sehr hilfreichen Anregungen habe ich versucht, ein Faltungsnetzwerk so zu machen:

 conv = Sequential() conv.add(Convolution1D(64, 10, input_shape=(1,101))) conv.add(Activation('relu')) conv.add(MaxPooling1D(2)) conv.add(Flatten()) conv.add(Dense(10)) conv.add(Activation('tanh')) conv.add(Dense(4)) conv.add(Activation('softmax')) 

Die Zeile conv.Add (Flatten ()) wirft einen Bereich überschreitet gültigen Grenzfehler. Interessanterweise wird dieser Fehler nicht nur für diesen Code geworfen:

 conv = Sequential() conv.add(Convolution1D(64, 10, input_shape=(1,101))) conv.add(Activation('relu')) conv.add(MaxPooling1D(2)) conv.add(Flatten()) 

tun

 print conv.input_shape print conv.output_shape 

Ergebnisse in

 (None, 1, 101 (None, -256) 

Zurückgegeben werden

Update 2:

Geändert

 conv.add(Convolution1D(64, 10, input_shape=(1,101))) 

nach

 conv.add(Convolution1D(10, 10, input_shape=(101,1)) 

Und es hat angefangen zu arbeiten Allerdings gibt es irgendwelche wichtige Unterschiede zwischen Eingabe (keine, 101, 1) zu einer 1d conv Schicht oder (keine, 1, 101), die ich beachten sollte? Warum funktioniert (keine, 1, 101) nicht?

One Solution collect form web for “Eingabe Dimensionen zu einem eindimensionalen Faltungsnetz in Keras”

Der Grund, warum es so aussieht, ist, dass Keras-Designer beabsichtigt, 1-dimensionales Faltungsgerüst zu machen, um als Rahmen für die Umwandlung von Sequenzen interpretiert zu werden. Um den Unterschied vollständig zu verstehen – versuchen Sie sich vorzustellen, dass Sie eine Sequenz von mehreren Feature-Vektoren haben. Dann ist Ihre Ausgabe mindestens zweidimensional – wo die erste Dimension mit der Zeit verbunden ist und andere Dimensionen mit Funktionen verbunden sind. 1-dimensionales Faltungsgerüst wurde entworfen, um in gewisser Weise mutig diese Zeitdimension zu sein und versuchen, die Wiederholungsmuster in Daten zu finden – anstatt eine klassische multidimensionale Faltungsumwandlung durchzuführen.

In deinem Fall musst du einfach deine Daten neu formatieren, um Gestalt zu haben (dataset_size, 101, 1) – weil du nur eine Funktion hast. Es könnte einfach mit numpy.reshape Funktion gemacht werden. Um zu verstehen, was ein neuer Schritt bedeutet – Sie müssen verstehen, dass Sie die Faltung im Laufe der Zeit machen – also ändern Sie die zeitliche Struktur Ihrer Daten – die zu einer neuen zeitgebundenen Struktur führen. Um Ihre Daten in ein Format zu bringen, das für dichte / statische Schichten geeignet ist, verwenden Sie die keras.layers.flatten Schicht – genauso wie im klassischen Faltungsfall.

UPDATE: Wie ich schon erwähnt habe – die erste Dimension der Eingabe ist mit der Zeit verbunden. So liegt der Unterschied zwischen (1, 101) und (101, 1) darin, dass man im ersten Fall einen zeitlichen Schritt mit 101 Features und in zweiter – 101 timesteps mit 1 Feature hat. Das Problem, das Sie nach Ihrer ersten Änderung erwähnt haben, hat seinen Ursprung in der Bündelung mit Größe 2 auf solche Eingabe. Wenn du nur ein mal Zeit hast, kannst du keinen Wert auf ein Zeitfenster der Größe 2 einbinden – einfach weil es nicht genug Zeitpunkte gibt, um das zu tun.

  • Theano 'Erwartet ein Array-ähnliches Objekt, aber fand eine Variable': Verwenden von scan & categorical_crossentropy
  • Wie können Sie mehrere neuronale Netzwerke gleichzeitig in nolearn / lasagne / theano auf Python trainieren?
  • Aktualisieren eines Teils einer gemeinsamen Variablen in Theano
  • Theano import error: Kein Modul namens cPickle
  • Name in Konflikt in Theano
  • Wie bekomme ich reproduzierbare Ergebnisse in Keras
  • Wie implementiere man gewichtete BinärkreuzEntropie auf theano?
  • Wie man cuDnn mit theano auf Windows 7 64 bit einrichtet
  • Benutzerdefinierte Theano Op, um numerische Integration zu tun
  • Theano - Druckwert von TensorVariable
  • Setzen Sie das letzte Nicht-Null-Element jeder Zeile auf Null - NumPy
  • Python ist die beste Programmiersprache der Welt.