web-dev-qa-db-fra.com

Keras - Entrez une image à 3 canaux dans LSTM

J'ai lu une séquence d'images dans un tableau numpy avec la forme (7338, 225, 1024, 3)7338 Est la taille de l'échantillon, 225 Sont les pas de temps et 1024 (32x32) sont pixels d'image aplatis, dans les canaux 3 (RVB).

J'ai un modèle séquentiel avec une couche LSTM:

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

Mais cela se traduit par l'erreur:

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

Le documentation mentionne que le tenseur d'entrée pour la couche LSTM devrait être une 3D tensor with shape (batch_size, timesteps, input_dim), mais dans mon cas, mon input_dim Est 2D.

Quelle est la méthode suggérée pour entrer une image à 3 canaux dans une couche LSTM dans Keras?

11
shubhamsingh

Si vous voulez que le nombre d'images soit une séquence (comme un film avec des cadres), vous devez mettre des pixels ET des canaux comme fonctionnalités:

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

Si vous voulez plus de traitement avant de lancer des fonctionnalités 3072 dans un LSTM, vous pouvez combiner ou entrelacer des convolutions 2D et des LSTM pour un modèle plus raffiné (pas nécessairement meilleur, cependant, chaque application a son comportement particulier).

Vous pouvez également essayer d'utiliser le nouveau ConvLSTM2D , qui prendra l'entrée en cinq dimensions:

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

Je créerais probablement un réseau convolutionnel avec plusieurs TimeDistributed(Conv2D(...)) et TimeDistributed(MaxPooling2D(...)) avant d'ajouter un TimeDistributed(Flatten()) et enfin le LSTM(). Cela améliorera très probablement à la fois votre compréhension de l'image et les performances du LSTM.

9
Daniel Möller