2016-08-11 12 views
1

meine Frage ist ziemlich eng verwandt mit this question aber geht auch darüber hinaus.Keras: LSTM mit Klassengewichten

Ich versuche, die folgenden LSTM in Keras zu implementieren, wo

  • die Anzahl der Zeitschritte nb_tsteps=10
  • die Anzahl des Eingangs seines Feature ist nb_feat=40
  • die Anzahl der LSTM Zellen in jedem Zeitschritt ist 120
  • Auf die LSTM-Schicht folgen die TimeDistributedDense-Schichten

Von der Frage oben I verwiesen verstehen, dass ich die Eingabedaten als

nb_samples, 10, 40

wo ich nb_samples vorlegen muß durch Walzen ein Fenster der Länge nb_tsteps=10 über die ursprüngliche Zeitreihe der Form (5932720, 40) erhalten. Der Code ist daher

model = Sequential() 
model.add(LSTM(120, input_shape=(X_train.shape[1], X_train.shape[2]), 
    return_sequences=True, consume_less='gpu')) 
model.add(TimeDistributed(Dense(50, activation='relu'))) 
model.add(Dropout(0.2)) 
model.add(TimeDistributed(Dense(20, activation='relu'))) 
model.add(Dropout(0.2)) 
model.add(TimeDistributed(Dense(10, activation='relu'))) 
model.add(Dropout(0.2)) 
model.add(TimeDistributed(Dense(3, activation='relu'))) 
model.add(TimeDistributed(Dense(1, activation='sigmoid'))) 

Nun zu meiner Frage (vorausgesetzt, die oben richtig ist bis jetzt): Die binären Antworten (0/1) sind stark unausgewogen und ich brauche einen class_weight Wörterbuch wie cw = {0: 1, 1: 25} zu model.fit() passieren. Allerdings bekomme ich eine Ausnahme class_weight not supported for 3+ dimensional targets. Dies liegt daran, dass ich die Antwortdaten als (nb_samples, 1, 1) präsentiere. Wenn ich es in ein 2D-Array umformen (nb_samples, 1) bekomme ich die Ausnahme Error when checking model target: expected timedistributed_5 to have 3 dimensions, but got array with shape (5932720, 1).

Vielen Dank für jede Hilfe!

Antwort

5

Ich denke, Sie sollten sample_weight mit sample_weight_mode='temporal' verwenden.

Aus dem Keras docs:

sample_weight: Numpy Array von Gewichten für die Trainingsproben verwendeten für den Verlust Skalierungsfunktion (während des Trainings nur). Sie können entweder ein flaches (1D) Numpy-Array mit der gleichen Länge wie die Eingangsabtastwerte (1: 1-Zuordnung zwischen Gewichten und Abtastwerten) übergeben, oder im Fall von temporären Daten können Sie ein 2D-Array mit Form übergeben (samples, sequence_length), , um auf jeden Zeitschritt jeder Probe ein anderes Gewicht anzuwenden. In diesem Fall sollten Sie sicherstellen, sample_weight_mode = "temporal" in compile() angeben.

In Ihrem Fall müssten Sie ein 2D-Array mit der gleichen Form wie Ihre Etiketten liefern.

+0

Ich verstehe nicht, warum sample_weight (mit sample_weight_mode = "temporal") relevant ist. Wir sprechen hier von Klassengewichten, nicht von Beispielgewichten, oder? sample_weight_mode = "temporal" weist jedem Sample in jedem Zeitschritt eine Gewichtung zu, hat aber nichts mit Klassenbezeichnungen zu tun? – ymeng