在keras或Tensorflow中的LSTM层之前添加密集层?
Add dense layer before LSTM layer in keras or Tensorflow?
我正在尝试实现一个带有 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
密集层可以将序列作为输入,并将在每个向量(最后一个维度)上应用相同的密集层。示例:
你有一个表示序列 (timesteps, dim_features)
的二维张量输入,如果你对它应用一个密集层并输出 new_dim,你将在该层之后拥有的张量将是一个新的张量序列 (timesteps, new_dim)
如果你有一个 3D 张量 (n_lines, n_words, embedding_dim)
可以是一个文档,有 n_lines
行,每行 n_words
个词,每个词有 embedding_dim
个维度,应用具有 new_dim 输出的密集层将为您提供形状为 (n_lines, n_words, new_dim)
的新文档张量(3D)
您可以 see here 您可以使用 Dense() 层提供和获取的维度输入和输出。
虽然 Nassim Ben 已经解释了背景,但由于 Google 带我来到这里,我想提一下 tensorflow.keras.Layers.Reshape
layer。
我最初是从“如何实现 dropout”的角度出发的,但 运行 遇到了同样的问题。
尽管不同的层 类(可能)已经嵌入了它们自己的退出选项,但我喜欢在中间压扁自己的、单独的 tensorflow.keras.Layers.Dropout
(因为它有助于我的弱者请注意跟踪它们)。
有
model.add(Reshape((1, Xtrain1.shape[1])))
现在依次压在 Dropout
(或 Dense
形式)和 LSTM
的层之间,至少我说服自己,有一个解决方案将对张量维度有不同要求的不同层组合在一起。
我正在尝试实现一个带有 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
密集层可以将序列作为输入,并将在每个向量(最后一个维度)上应用相同的密集层。示例:
你有一个表示序列 (timesteps, dim_features)
的二维张量输入,如果你对它应用一个密集层并输出 new_dim,你将在该层之后拥有的张量将是一个新的张量序列 (timesteps, new_dim)
如果你有一个 3D 张量 (n_lines, n_words, embedding_dim)
可以是一个文档,有 n_lines
行,每行 n_words
个词,每个词有 embedding_dim
个维度,应用具有 new_dim 输出的密集层将为您提供形状为 (n_lines, n_words, new_dim)
您可以 see here 您可以使用 Dense() 层提供和获取的维度输入和输出。
虽然 Nassim Ben 已经解释了背景,但由于 Google 带我来到这里,我想提一下 tensorflow.keras.Layers.Reshape
layer。
我最初是从“如何实现 dropout”的角度出发的,但 运行 遇到了同样的问题。
尽管不同的层 类(可能)已经嵌入了它们自己的退出选项,但我喜欢在中间压扁自己的、单独的 tensorflow.keras.Layers.Dropout
(因为它有助于我的弱者请注意跟踪它们)。
有
model.add(Reshape((1, Xtrain1.shape[1])))
现在依次压在 Dropout
(或 Dense
形式)和 LSTM
的层之间,至少我说服自己,有一个解决方案将对张量维度有不同要求的不同层组合在一起。