Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Add dense layer before LSTM layer in keras or Tensorflow?

I am trying to implement a denoising autoencoder with an LSTM layer in between. The architecture goes following.

FC layer -> FC layer -> LSTM cell -> FC layer -> FC layer.

I am unable to understand how my input dimension should be to implement this architecture?

I tried the following code

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)

My trainX is [650,20,1] vector. It is a time series data in with only one feature.

I am getting following error

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
like image 984
Nilay Thakor Avatar asked Mar 10 '17 09:03

Nilay Thakor


People also ask

Why do we add dense layers to LSTM?

The last Dense layer is added to get output in format needed by the user. Here Dense(10) means 10 different classes output will be generated using softmax activation. In case you are using LSTM for time series then you should have Dense(1). So that only one numeric output is given.

How do I add a dense layer in Tensorflow?

A dense layer can be added to the sequential model using the 'add' method, and specifying the type of layer as 'Dense'. The layers are first flattened, and then a layer is added. This new layer will be applied to the entire training dataset.

What does dense layer do in LSTM?

Dense layer is the regular deeply connected neural network layer. It is most common and frequently used layer. Dense layer does the below operation on the input and return the output.

How many dense layers does LSTM have?

Our neural network architecture composed of two LSTM layers and a dense node to consolidate output.


1 Answers

The dense layer can take sequences as input and it will apply the same dense layer on every vector (last dimension). Example :

You have a 2D tensor input that represents a sequence (timesteps, dim_features), if you apply a dense layer to it with new_dim outputs, the tensor that you will have after the layer will be a new sequence (timesteps, new_dim)

If you have a 3D tensor (n_lines, n_words, embedding_dim) that can be a document, with n_lines lines, n_words words per lines and embedding_dim dimensions for each word, applying a dense layer to it with new_dim outputs will get you a new doc tensor (3D) with shape (n_lines, n_words, new_dim)

You can see here the dimensions input and output that you can feed and get with the Dense() layer.

like image 121
Nassim Ben Avatar answered Sep 29 '22 07:09

Nassim Ben