2017-12-06 3 views
2

I mit Form einer Folge von Bildern in einen numpy Array gelesen haben (7338, 225, 1024, 3) wo 7338 die Probengröße ist, werden 225 die Zeitschritte und 1024 (32x32) werden Bildpixel abgeflacht, in 3 Kanälen (RGB).Keras - Eingang ein 3-Kanal-Bild in LSTM

Ich habe ein sequentielles Modell mit einer LSTM Schicht:

model = Sequential() 
model.add(LSTM(128, input_shape=(225, 1024, 3)) 

Aber dies führt zu dem Fehler:

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

Die documentation erwähnt, dass der Eingang Tensor für LSTM Schicht ein 3D tensor with shape (batch_size, timesteps, input_dim) sein sollte, aber in meinem Fall ist meine input_dim 2D.

Wie wird ein 3-Kanal-Bild in eine LSTM-Ebene in Keras eingegeben?

+0

haben Sie versucht, input_shape = X_train.shape [1:] zu geben. Angenommen, X_train ist Ihr Eingabe-Array –

+0

Ja, ich habe. 'X_train.shape [1:]' gibt mir '(225, 1024, 3)' was hart programmiert wurde als der 'input_shape' Parameter – shubhamsingh

Antwort

2

Wenn Sie die Anzahl der Bilder wollen eine Sequenz sein (wie ein Film mit Frames), müssen Sie Pixel und Kanäle setzen, wie Features:

input_shape = (225,3072) #a 3D input where the batch size 7338 wasn't informed 

Wenn Sie vor dem Wurf 3072 weitere Verarbeitung wollen Features in ein LSTM, können Sie 2D-Faltungen und LSTMs für ein verfeinertes Modell kombinieren oder verschachteln (nicht unbedingt besser, obwohl jede Anwendung ihr besonderes Verhalten hat).

Sie können auch versuchen, die neuen ConvLSTM2D zu verwenden, die die fünf dimensionale Eingabe nehmen:

input_shape=(225,32,32,3) #a 5D input where the batch size 7338 wasn't informed 

ich wahrscheinlich ein Faltungsnetz mit mehrere TimeDistributed(Conv2D(...)) schaffen würde und TimeDistributed(MaxPooling2D(...)) vor einem TimeDistributed(Flatten()) Zugabe und endlich die LSTM(). Dies wird sehr wahrscheinlich sowohl Ihr Bildverständnis als auch die Leistung des LSTM verbessern.

+0

Ich dachte über die Umgestaltung meiner Daten von' (1024, 3) 'zu '3072', aber ich hatte bereits die Daten in Batch-Größe von' 7338' und das Umformen benötigte viel Zeit. Und das LSTM ist Teil eines Auto-Encoders, also war ich mir nicht sicher, ob diese Umformung mir helfen würde. Wird zuerst die Umformung versuchen, dann mit 'ConvLSTM2D' und' TimeDistributed' Schichten. Danke für deine Antwort. – shubhamsingh

+0

Umformung Zeit nehmen ??? Das hört sich nicht gut an ... das LSTM wäre aber sehr, sehr langsam. –

+0

Ja, ich denke, das ist der Grund, dass ich '1651050 (7738 * 225)' Instanzen neu gestalten werde. Anstatt also alles zusammen zu tun, griff ich auf die Keras-Modellmethode von [fit_generator()] (https://keras.io/models/sequential/#fit_generator) zurück, wo ich eine Generatormethode zur Umformung des Datensatzes erstelle, während des Trainings. – shubhamsingh