Keras 简单的 RNN 实现

Keras simple RNN implementation

我在尝试用一个循环层编译网络时发现问题。第一层的维度似乎存在一些问题,因此我对 RNN 层在 Keras 中的工作方式的理解。

我的代码示例是:

model.add(Dense(8,
                input_dim = 2,
                activation = "tanh",
                use_bias = False))
model.add(SimpleRNN(2,
                    activation = "tanh",
                    use_bias = False))
model.add(Dense(1,
                activation = "tanh",
                use_bias = False))

错误是

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

无论 input_dim 值如何,都会返回此错误。我错过了什么?

该消息意味着:进入 rnn 的输入有 2 个维度,但 rnn 层需要 3 个维度。

对于 RNN 层,您需要形状像 (BatchSize, TimeSteps, FeaturesPerStep) 的输入。这些是预期的 3 个维度。

Dense 层(在 keras 2 中)可以使用 2 维或 3 维。我们可以看到您使用的是 2,因为您传递了 input_dim 而不是 input_shape=(Steps,Features)

有很多可能的方法可以解决这个问题,但最有意义和合乎逻辑的是输入数据是具有时间步长的序列的情况。

解决方案 1 - 您的训练数据是一个序列:

如果您的训练数据是一个序列,您可以将其塑造成 (NumberOfSamples, TimeSteps, Features) 并将其传递给您的模型。确保在第一层使用 input_shape=(TimeSteps,Features) 而不是 input_dim

解决方案 2 - 重塑第一个密集层的输出,使其具有额外的维度:

model.add(Reshape((TimeSteps,Features)))

确保乘积 TimeSteps*Features 等于 8,第一个密集层的输出。