6

我在尝试用一个循环层编译网络时发现了问题。似乎第一层的维度存在一些问题,因此我对 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值如何,都会返回此错误。我错过了什么?

4

1 回答 1

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)))

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

于 2017-09-16T17:49:23.660 回答