2017-03-10 3 views
3

J'essaye d'implémenter un autoencoder de débruitage avec une couche de LSTM entre les deux. L'architecture va suivre. Je ne suis pas capable de comprendre comment ma dimension d'entrée devrait être de mettre en œuvre cette architecture?Ajouter une couche dense avant couche LSTM dans keras ou Tensorflow?

J'ai essayé le code suivant

batch_size = 1 
model = Sequential() 
model.add(Dense(5, input_shape=(1,))) 
model.add(Dense(10)) 
model.add(LSTM(32)) 
model.add(Dropout(0.3)) 
model.add(Dense(5)) 
model.add(Dense(1)) 
model.compile(loss='mean_squared_error', optimizer='adam') 
model.fit(trainX, trainY, nb_epoch=100, batch_size=batch_size, verbose=2) 

Mon trainX est [650,20,1] vecteur. Il s'agit d'une série de données chronologiques avec une seule caractéristique.

J'obtiens l'erreur suivante

ValueError        Traceback (most recent call last) 
<ipython-input-20-1248a33f6518> in <module>() 
     3 model.add(Dense(5, input_shape=(1,))) 
     4 model.add(Dense(10)) 
----> 5 model.add(LSTM(32)) 
     6 model.add(Dropout(0.3)) 
     7 model.add(Dense(5)) 

/usr/local/lib/python2.7/dist-packages/keras/models.pyc in add(self, layer) 
    330     output_shapes=[self.outputs[0]._keras_shape]) 
    331   else: 
--> 332    output_tensor = layer(self.outputs[0]) 
    333    if isinstance(output_tensor, list): 
    334     raise TypeError('All layers in a Sequential model ' 

/usr/local/lib/python2.7/dist-packages/keras/engine/topology.pyc in __call__(self, x, mask) 
    527    # Raise exceptions in case the input is not compatible 
    528    # with the input_spec specified in the layer constructor. 
--> 529    self.assert_input_compatibility(x) 
    530 
    531    # Collect input shapes to build layer. 

/usr/local/lib/python2.7/dist-packages/keras/engine/topology.pyc in assert_input_compatibility(self, input) 
    467           self.name + ': expected ndim=' + 
    468           str(spec.ndim) + ', found ndim=' + 
--> 469           str(K.ndim(x))) 
    470    if spec.dtype is not None: 
    471     if K.dtype(x) != spec.dtype: 

ValueError: Input 0 is incompatible with layer lstm_10: expected ndim=3, found ndim=2 
+0

Voulez-vous appliquer un 'Dense' à chaque pas de temps? –

+0

Juste pour clarifier, j'essaye de mettre en application l'architecture du papier suivant. http://www1.icsi.berkeley.edu/~vinyals/Files/rnn_denoise_2012.pdf. Il suffit de remplacer la couche RNN par une cellule LSTM. –

+0

Dans ce cas, la réponse de Nassim est correcte. –

Répondre

3

La couche dense peut prendre des séquences en entrée et il appliquera la même couche dense sur tous les vecteurs (dernière dimension). Exemple:

Vous avez une entrée tenseur 2D qui représente une séquence (timesteps, dim_features), si vous appliquez une couche dense avec sorties new_dim, le tenseur que vous aurez après la couche sera une nouvelle séquence (timesteps, new_dim)

Si vous avez un tenseur 3D (n_lines, n_words, embedding_dim) qui peut être un document, avec n_lines lignes, n_words mots par lignes et embedding_dim dimensions pour chaque mot, l'application d'une couche dense avec des sorties new_dim vous obtiendrez un nouveau tenseur doc (3D) avec la forme (n_lines, n_words, new_dim)

Vous pouvez see here le dimensions entrée et sortie que vous pouvez nourrir et obtenir avec le calque Dense().

+0

comment savez-vous si c'était une intention OP? Ce n'est pas simple à partir de la question. –

+0

J'ai couru un peu de PNL sur sa question pour le prédire :) (juste deviné, peut-être pas, mais puisqu'il n'y a pas beaucoup d'informations je suppose qu'il a un niveau débutant donc même si ce n'était pas sa question je pense aidez-le de toute façon :) sinon, bien cette réponse est quelques octets sur un serveur, ne tue pas anywone). –

+0

Je demande - parce que je pensais à une sorte de 'Embedding' avec des modifications d'apprentissage de transfert« linéaire ». Dans ce cas, votre réponse pourrait être nuisible. La perspicacité que vous avez fournie est intéressante mais en réalité pourrait être complètement trompeuse. –