0

Ich versuche, eine Conv1D und Bidirektionale LSTM in keras zu verwenden (ähnlich wie in this question) für die Signalverarbeitung, sondern eine mehrklassige Klassifizierung von jedem Zeitschritt zu tun.Wie Conv1D und bidirektionales LSTM in Keras zu verwenden, um Klassenklassifizierung von jedem Zeitschritt zu tun?

Das Problem ist, dass, obwohl die Formen von Conv1D und LSTM sind etwas gleichwertig verwendet:

Conv1D: (Batch, Länge, Kanäle)
LSTM: (Batch, Zeitschritte, Funktionen)

der Ausgang des Conv1D ist = (Länge - (kernel_size - 1)/Fortschritte) und daher nicht die Form LSTM mehr ohne MaxPooling1D und Dropout, auch überein.

Um genauer zu sein, hat mein Trainingssatz X n Proben mit 1000 Zeitschritten und einem Kanal (n_samples, 1000, 1), und ich verwendete LabelEncoder und OneHotEncoder, so hat n Proben, 1000 Zeitschritte und 5 ein heißes kodierte Klassen (n_samples, 1000, 5).

Da eine Klasse viel häufiger als die anderen ist (ist eigentlich die Abwesenheit von Signal), verwende ich Verlust = 'sparse_categorical_crossentropy', sample_weight_mode = "temporal" und sample_weight, um Zeitschritte mit sinnvollen Klassen ein höheres Gewicht zu geben .

model = Sequential() 
model.add(Conv1D(128, 3, strides=1, input_shape = (1000, 1), activation = 'relu')) 
model.add(Bidirectional(LSTM(128, return_sequences=True))) 
model.add(TimeDistributed(Dense(5, activation='softmax'))) 
model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['categorical_accuracy'], sample_weight_mode="temporal") 
print(model.summary()) 

Model

Wenn ich versuche, das Modell, das ich diese Fehlermeldung zu passen:

Fehler bei der Überprüfung Ziel: erwartete time_distributed_1 Form (None, 998, 1) zu haben, aber habe Array mit Form (100, 1000, 5) bekommen.

Gibt es eine Möglichkeit, eine solche neuronale Netzwerkkonfiguration zu ermöglichen?

Antwort

0

Ihre Faltung die Spitzen der Sequenz schneidet. Verwenden Sie padding='same' in den Faltungsschichten.

Die Nachricht, scheint aber nicht das Modell zu passen. Ihr Modell hat klar 5 Ausgabefunktionen (wegen Dense(5)), aber die Massage sagt, es erwartet 1. Vielleicht geschieht dies, weil das „spärlich“ crossentropy. Sie sollten wahrscheinlich, durch das Format Ihrer Daten, eine "categorical_crossentropy" verwenden.

+0

Vielen Dank für die 'same'' Teil 'padding =. Allerdings habe ich keine Ahnung, warum ich diese Fehlermeldung bekomme, obwohl ich die 'Dense (5)' habe. Jetzt heißt es: "expected time_distributed_1 hat Form (None, 1000, 1), aber Array mit Shape (100, 1000, 5)". – JPM

+0

Ist es nicht wegen der "spärlichen" kategorischen Crossentropie? Ich glaube nicht, dass Sie spärlich brauchen, wenn Ihre Daten alle 5 Elemente haben. –

+0

Großartig, das war es! In "categorical_crossentropy" geändert und es hat perfekt funktioniert! Ich frage mich, wann man "sparse_categorical_crossentropy" verwenden würde ... – JPM

Verwandte Themen