Keras简单的RNN实现

时间:2017-09-16 16:54:34

标签: 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))

错误是

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

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

1 个答案:

答案 0 :(得分:3)

该消息表示:进入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,即第一个密集图层的输出。