2017-08-25 1 views
1

J'ai une question sur la façon de combiner une couche convolutive et une couche LSTM travaillant ensemble dans Keras. Supposons que j'utilise un CNN pour définir des mappages de caractéristiques pour une image. Et après une couche convolutionnelle particulière, j'ai une carte de caractéristiques, disons F, dont la dimension est (H, W, C). Maintenant, je veux utiliser chaque ligne de cette carte, comme [1 ::], [2 ::], ....., comme l'entrée de la couche LSTM suivante, mais itérativement H fois.A propos de l'utilisation de la sortie de la couche convolutive en tant qu'entrée LSTM

La sortie de LSTM est un tenseur (H, W).

Existe-t-il un moyen de le faire dans keras avec le calque par défaut? Ou j'ai besoin d'implémenter une couche personnalisée?

Merci


j'ai essayé d'utiliser la couche Timedistributed dans mon modèle, mais il ne fonctionne pas. En fait, ce que je veux mettre en œuvre est une version simplifiée de link.

Ici, je veux juste utiliser LSTM pour balayer chaque ligne des sorties de mon Conv2D et étiqueter chaque pixel de celui-ci. Mon code est comme suit:

input_img = Input(shape=(256,256,1)) 

# encoder 
x = Conv2D(filters=16, kernel_size=(5,5))(input_img) 
x = MaxPooling2D((2, 2), padding='same')(x) # 128x128 
x = Conv2D(filters=32, kernel_size=(3,3))(x) 
encoded = MaxPooling2D((2, 2), padding='same')(x) # 64x64 

# decoder 
x = Conv2D(filters=32, kernel_size=(3,3))(encoded) 
x = UpSampling2D((2, 2))(x) 
x = Conv2D(filters=16, kernel_size=(5,5))(x) 
x = UpSampling2D((2, 2))(x) 

# Using LSTM to produce final outputs 
decoded = TimeDistributed(LSTM(3, input_shape=(32, 16),return_sequences=True))(x) 

model = Model(input_img, decoded) 

Mais il semble que mon modèle ne peut converger ......

+0

voir l'exemple ci-dessous le titre "Visual Question répondeur modèle" ici: https://keras.io/getting-started/functional-api-guide/, il pourrait être pertinent. –

Répondre

0

Il semble une manipulation matricielle générale. Vous avez juste besoin de diviser la matrice en matrices H à la première dimension de la carte d'entités, puis de les transmettre à votre couche LSTM de manière itérative. Vous obtiendrez des vecteurs H 1 * W comme sortie de LSTM, les concaténer à la première dimension puis vous obtiendrez une sortie H * W.

+0

Oui, c'est une manipulation matricielle en effet. Mais je ne suis pas sûr si je l'implémente dans Keras, ai-je besoin de créer un calque pour le faire? –

+0

@simbabuffalo Je n'utilise pas keras mais je pense que c'est une question générale. Je ne vois pas pourquoi vous avez besoin d'une autre couche car cela ne nécessite aucune transformation dans votre cas. –