2017-05-01 4 views
1

Ich habe eine Liste der markierten Sätze. I umgewandelt jeder von ihnen in der folgenden Art und Weise:Keras: Einbetten und LSTM Ebenen für POS-Tagging-Aufgabe

  • Für jedes Wort , erhält die relative One-Hot-Kodierung Form (ein Vektor der Dimension input_dim);
  • Fügen Sie ein Pre-Padding wie im folgenden Beispiel beschrieben ein;
  • Teilen Sie jeden Satz in len(sentence) Sub-Sätze, mit einem Fenster der Größe time_steps (um den Kontext für die Vorhersage des nächsten Wortes zu bekommen).

Zum Beispiel mit time_steps=2, ein einziger Satz ["this", "is", "an", "example"] in umgewandelt wird:

[ 
    [one_hot_enc("empty_word"), one_hot_enc("empty_word")], 
    [one_hot_enc("empty_word"), one_hot_enc("this")], 
    [one_hot_enc("this"), one_hot_enc("is")], 
    [one_hot_enc("is"), one_hot_enc("an")], 
] 

Am Ende unter Berücksichtigung der Untersätze als eine einzigartige Liste, die Form der Zugdaten X_train ist (num_samples, time_steps, input_dim) , wo:

  • input_dim: die Größe meines Vokabulars;
  • time_steps: die Länge der Sequenz in LSTM zu verwenden;
  • num_samples: die Anzahl der Stichproben (Untersätze);

Jetzt möchte ich eine Embedding Schicht verwenden, um jedes Wort zu einem kleineren einem kontinuierlichen dreidimensionalen Raum abzubilden, und eine LSTM, in denen ich die Kontexte, wie oben bauen.

habe ich versucht, so etwas wie dieses:

model = Sequential() 
model.add(InputLayer(input_shape=(time_steps, input_dim))) 
model.add(Embedding(input_dim, embedding_size, input_length=time_steps)) 
model.add(LSTM(32)) 
model.add(Dense(output_dim)) 
model.add(Activation('softmax')) 

Aber gibt mir die folgende Fehlermeldung:

ValueError: Input 0 is incompatible with layer lstm_1: expected ndim=3, found ndim=4 

Was ich dabei? Es gibt einen logischen Fehler in dem, was ich versuche zu tun?

Antwort

1

Sie können einfach die Eingabeebene entfernen und die Einbettungsschicht als erste Ebene des Netzwerks definieren. Oder Sie können die Eingabeebene durch Entfernen der "input_dim" wie

model.add(InputLayer(input_shape=(time_steps,))) 
konstruieren