Keras简单的RNN实现

dev*_*223 6 machine-learning neural-network keras recurrent-neural-network rnn

尝试使用一个循环图层编译网络时发现了问题.似乎第一层的维度存在一些问题,因此我理解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))
Run Code Online (Sandbox Code Playgroud)

错误是

ValueError: Input 0 is incompatible with layer simple_rnn_1: expected ndim=3, found ndim=2
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*ler 4

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

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

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

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

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

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

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

model.add(Reshape((TimeSteps,Features)))
Run Code Online (Sandbox Code Playgroud)

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