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