2016-12-22 4 views
2

Mein Problem ist es, alle versteckten Ausgaben von einem LSTM zu nehmen und sie als Trainingsbeispiele für eine einzelne dichte Schicht zu verwenden. Es ist nicht das, was ich anstrebe, die Ausgabe der versteckten Schichten zu reduzieren und sie einer dichten Schicht zuzuführen. Ich habe folgende Dinge ausprobiert:Wie ändert man die Chargengröße einer Zwischenschicht in Keras?

  1. ich Timedistributed Wrapper für die dichte Schicht (https://keras.io/layers/wrappers/) in Betracht gezogen haben. Aber das scheint die gleiche Schicht auf jede Zeitscheibe anzuwenden, was ich nicht will. Mit anderen Worten, der Timedistributed-Wrapper hat input_shape eines 3D-Tensors (Anzahl der Samples, Anzahl der Zeitschritte, Anzahl der Features) und erzeugt einen weiteren 3D-Tensor des gleichen Typs: (Anzahl der Samples, Anzahl der Zeitschritte, Anzahl der Features). Stattdessen, was ich will, ist eine 2D-Tensor als Ausgabe, die wie (Anzahl der Proben * Anzahl der Zeitschritte, die Anzahl der Funktionen)

  2. Es gab eine Pull-Anforderung für eine AdvancedReshapeLayer aussieht: https://github.com/fchollet/keras/pull/36 auf GitHub. Das scheint genau das zu sein, wonach ich suche. Leider scheint es so zu sein, dass die Pull-Anfrage ohne schlüssiges Ergebnis abgeschlossen wurde.

  3. Ich habe versucht, meine eigene Lambda-Schicht zu bauen, um zu erreichen, was ich will, wie folgt: A). model.add(LSTM(NUM_LSTM_UNITS, return_sequences=True, activation='tanh')) # B). model.add(Lambda(lambda x: x, output_shape=lambda x: (x[0]*x[1], x[2]))) C). model.add(Dense(NUM_CLASSES, input_dim=NUM_LSTM_UNITS))

mode.output_shape nach (A) druckt: (batch_size, NUM_TIME_STEPS, NUM_LSTM_UNITS) und model.output_shape nach (B) druckt: (BATCH_SIZE * NUM_OF_TIMESTEPS, NUM_LSTM_UNITS)

Was genau ich versuche zu erreichen.

Leider, wenn ich versuche, Schritt (C) auszuführen. Ich erhalte die folgende Fehlermeldung:

Input 0 is incompatible with layer dense_1: expected ndim=2, found ndim=3

Dies ist verwirrend, da, wenn ich drucken model.output_shape nach (B), ich sehe in der Tat (batch_size * NUM_OF_TIMESTEPS, NUM_LSTM_UNITS), die von NDIM = 2 ist.

Wirklich zu schätzen jede Hilfe mit diesem.

EDIT: Wenn ich versuche, anstelle eines sequentiellen Modell der funktionalen API zu verwenden, habe ich noch den gleichen Fehler auf Schritt (C) erhalten

Antwort

0

Sie Backend reshape verwenden können, die batch_size Dimension enthält.

def backend_reshape(x): 
    return backend.reshape(x, (-1, NUM_LSTM_UNITS)) 

model.add(Lambda(backend_reshape, output_shape=(NUM_LSTM_UNITS,))) 
+0

Das ist großartig. Danke vielmals. – shoaib369

Verwandte Themen