【问题标题】:Add dense layer before LSTM layer in keras or Tensorflow?在 keras 或 Tensorflow 中的 LSTM 层之前添加密集层?
【发布时间】:2017-07-31 13:55:17
【问题描述】:

我正在尝试实现一个降噪自动编码器,其间有一个 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

【问题讨论】:

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


【解决方案1】:

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

您有一个表示序列(timesteps, dim_features) 的二维张量输入,如果您使用 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() 层提供和获取。

【讨论】:

  • 你怎么知道这是否是 OP 意图?从这个问题来看,这并不简单。
  • 我在他的问题上运行了一些 NLP 来预测它 :) (只是猜测,可能不是,但由于没有太多信息,我猜他有一个初学者水平,所以即使它不是他的问题我认为无论如何都会对他有所帮助:)如果没有,那么这个答案是服务器上的几个字节,不会杀死任何人)。
  • 我在问 - 因为我想到了某种 Embeddinglinear 迁移学习修改。在这种情况下,您的回答可能是有害的。您提供的见解很有趣,但实际上可能完全具有误导性。
  • 你是对的,请随意编辑并发出警告:) 否则我可以删除答案。
  • 我会留下它 - 但我也会等待评论中的 OP 回答以指定他实际想要做什么:)
【解决方案2】:

虽然 Nassim Ben 已经解释了背景,但由于 Google 把我带到这里,我还是想提一下 tensorflow.keras.Layers.Reshape layer

我最初来自“如何实现 dropout”的观点,但遇到了同样的问题。

尽管不同的 Layer 类(可能)已经嵌入了它们自己的 dropout-options,但我喜欢在它们之间有自己的、单独的 tensorflow.keras.Layers.Dropout 挤压(因为它有助于我虚弱的头脑跟踪它们)。

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

现在依次挤压Dropout(或Dense)和LSTM 形式的层之间,至少我说服自己,有一个解决方案将具有不同要求的不同层结合在一起张量维数。

【讨论】:

    猜你喜欢
    • 2019-01-14
    • 1970-01-01
    • 2019-08-21
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    • 2018-05-21
    • 2018-02-22
    相关资源
    最近更新 更多