我在尝试编译一个包含一个循环层的网络时遇到了问题。似乎第一层的维度存在一些问题,因此我对Keras中RNN层的工作原理有些不理解。
我的代码示例是:
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 – 你重塑第一层Dense层的输出,使其具有额外的维度:
model.add(Reshape((TimeSteps,Features)))
确保TimeSteps*Features
的乘积等于8
,即你的第一层Dense层的输出。