在keras或Tensorflow中的LSTM层之前添加密集层?

时间:2017-03-10 09:24:22

标签: neural-network deep-learning keras lstm keras-layer

我正在尝试实现一个带有LSTM层的去噪自动编码器。该架构如下。

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

我无法理解我的输入维度应该如何实现这种架构?

我尝试了以下代码

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)

我的trainX是[650,20,1]向量。它只是一个时间序列数据。

我收到以下错误

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

2 个答案:

答案 0 :(得分:4)

密集层可以将序列作为输入,并且它将在每个矢量(最后维度)上应用相同的密集层。示例:

您有一个表示序列(timesteps, dim_features)的2D张量输入,如果使用new_dim输出对其应用密集图层,则图层之后的张量将是新序列(timesteps, new_dim)

如果你有一个3D张量(n_lines, n_words, embedding_dim)可以是一个文档,包含n_lines行,每行n_words个字和每个字embedding_dim个维度,应用密集使用new_dim输出的图层将为您提供一个新的文档张量(3D),其形状为(n_lines, n_words, new_dim)

您可以see here您可以提供的尺寸输入和输出,并使用Dense()图层。

答案 1 :(得分:0)

尽管Nassim Ben已经解释了背景,正如Google将我带到这里的同时,我还是要提到tensorflow.keras.Layers.Reshape layer

我最初是从“如何实现辍学”的角度出发的,但是遇到了同样的问题。

尽管不同的Layer类(可能)已经嵌入了它们自己的dropout-options,但我还是希望将自己的独立tensorflow.keras.Layers.Dropout插入其中(因为这有助于我虚弱的头脑跟踪它们)

使用

model.add(Reshape((1, Xtrain1.shape[1])))

现在依次压缩成Dropout(或DenseLSTM形式的层之间,至少我说服自己,一个解决方案将不同的联系在一起张量方面具有不同要求的层。