Grundlegendes zum input_shape-Parameter in LSTM mit Keras

20

Ich versuche das in der Keras-Dokumentation beschriebene Beispiel mit dem Namen "Stacked LSTM for Sequence Classification" (siehe Code unten) zu verwenden und kann den input_shapeParameter im Kontext meiner Daten nicht herausfinden .

Ich habe als Eingabe eine Matrix von Sequenzen von 25 möglichen ganzen Zahlen in einem aufgefüllten Folge maximaler Länge codierten Zeichen 31. Als Ergebnis meines x_trainhat die Form (1085420, 31)Bedeutung (n_observations, sequence_length).

from keras.models import Sequential
from keras.layers import LSTM, Dense
import numpy as np

data_dim = 16
timesteps = 8
num_classes = 10

# expected input data shape: (batch_size, timesteps, data_dim)
model = Sequential()
model.add(LSTM(32, return_sequences=True,
               input_shape=(timesteps, data_dim)))  # returns a sequence of vectors of dimension 32
model.add(LSTM(32, return_sequences=True))  # returns a sequence of vectors of dimension 32
model.add(LSTM(32))  # return a single vector of dimension 32
model.add(Dense(10, activation='softmax'))

model.compile(loss='categorical_crossentropy',
              optimizer='rmsprop',
              metrics=['accuracy'])

# Generate dummy training data
x_train = np.random.random((1000, timesteps, data_dim))
y_train = np.random.random((1000, num_classes))

# Generate dummy validation data
x_val = np.random.random((100, timesteps, data_dim))
y_val = np.random.random((100, num_classes))

model.fit(x_train, y_train,
          batch_size=64, epochs=5,
          validation_data=(x_val, y_val))

In diesem Code x_trainhat die Form (1000, 8, 16), wie für ein Array von 1000 Arrays von 8 Arrays von 16 Elementen. Dort verliere ich mich völlig darüber, was ist und wie meine Daten diese Form erreichen können.

Wenn ich mir Keras doc und verschiedene Tutorials und Fragen und Antworten anschaue, scheint mir etwas Offensichtliches zu fehlen. Kann mir jemand einen Tipp geben, wonach ich suchen soll?

Danke für Ihre Hilfe !

mazieres
quelle

Antworten:

23

LSTM-Formen sind hart, also fühle dich nicht schlecht. Ich musste ein paar Tage damit verbringen, sie selbst zu bekämpfen:

Wenn Sie jeweils 1 Zeichen eingeben, sollte Ihre Eingabeform (31,1) sein, da Ihre Eingabe 31 Zeitschritte mit jeweils 1 Zeichen enthält. Sie müssen Ihr x_train von (1085420, 31) auf (1085420, 31,1) umformen, was mit diesem Befehl einfach zu bewerkstelligen ist:

 x_train=x_train.reshape(x_train.shape[0],x_train.shape[1],1))
Rosenflanz
quelle
2

Überprüfen Sie dieses LSTM-Keras-Zusammenfassungsdiagramm des Git-Repository und ich glaube, Sie sollten alles kristallklar bekommen.

Dieses Git-Repo enthält ein Keras LSTM-Zusammenfassungsdiagramm, das Folgendes zeigt:

  • die Verwendung von Parametern wie return_sequences, batch_size, time_step...
  • die reale Struktur von LSTM-Schichten
  • das Konzept dieser Schichten in Keras
  • Wie manipulieren Sie Ihre Eingabe- und Ausgabedaten, um sie an Ihre Modellanforderungen anzupassen? Wie stapeln Sie die LSTM-Layer?

Und mehr

Mohammad Fneish
quelle
Vielen Dank dafür, @MohammadFneish. Dies scheint jetzt hilfreicher zu sein. Es ist jedoch nicht klar, dass dies eine gute Antwort auf die Frage ist , im Gegensatz zu einem hilfreichen Vorschlag. Beachten Sie, dass es sich bei Cross Validated ausschließlich um eine Frage- und Antwortseite handelt, nicht um ein Forum. Können Sie [noch mehr] Informationen hinzufügen, um den Eingabeformparameter zu erläutern?
gung - Wiedereinstellung von Monica
3
@gung Ich schätze die Art und Weise, wie Sie es schaffen, diese Antworten zu überprüfen, um die Standards beizubehalten, sehr, aber ich denke, dass ich nicht noch mehr über diese Parameter herausfinden kann, wenn es viele technische Details dazu gibt. Ich denke nur, dass meine Antwort für Entwickler hilfreich sein könnte, die ähnliche Probleme mit Keras-Eingaben haben und nicht unbedingt dieses spezielle Problem. Danke
Mohammad Fneish
1

Ich weiß, es ist keine direkte Antwort auf Ihre Frage. Dies ist ein vereinfachtes Beispiel mit nur einer LSTM-Zelle, das mir hilft, die Umformungsoperation für die Eingabedaten zu verstehen.

from keras.models import Model
from keras.layers import Input
from keras.layers import LSTM
import numpy as np

# define model
inputs1 = Input(shape=(2, 3))
lstm1, state_h, state_c = LSTM(1, return_sequences=True, return_state=True)(inputs1)
model = Model(inputs=inputs1, outputs=[lstm1, state_h, state_c])

# define input data
data = np.random.rand(2, 3)
data = data.reshape((1,2,3))

# make and show prediction
print(model.predict(data))

Dies wäre ein Beispiel für ein LSTM-Netzwerk mit nur einer einzelnen LSTM-Zelle und Eingangsdaten mit einer bestimmten Form.

Es stellt sich heraus, dass wir hier nur vorhersagen, dass die Schulung der Einfachheit halber nicht vorhanden ist, sondern wie wir die Daten vor der predictMethode umformen mussten (um zusätzliche Dimensionen hinzuzufügen) .

prosti
quelle