6

我在尝试编译具有一个重复层的网络时发现了问题。第一层的维度似乎有一些问题,因此我对RNN层如何在Keras中工作的理解也有一些问题。

我的代码示例是:

模型添加(密度(8,input_dim=2,激活=“tanh”,use_bias=假))模型.添加(SimpleRNN(2,激活=“tanh”,use_bias=假))模型.添加(密度(1,激活=“tanh”,use_bias=假))

错误是

ValueError:输入0与层simple_rnn_1不兼容:应为ndim=3,发现ndim=2

无论输入_输入值。我错过了什么?

1答案1

重置为默认值
4

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

对于RNN层,您需要如下形式的输入(BatchSize、TimeSteps、FeaturesPerStep)。这是预期的3个维度。

A类稠密图层(在keras2中)可以用于二维或三维。我们可以看到您正在与2合作,因为您通过了输入_输入而不是传递input_shape=(步骤,特征).

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

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

如果您的训练数据是一个序列,那么您可以将其塑造为(采样数、时间步长、功能)并将其传递给您的模型。确保使用input_shape=(时间步,功能)在第一层,而不是使用输入_输入.

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

model.add(重塑((TimeSteps,Features))

确保产品TimeSteps*功能等于8,第一个致密层的输出。

4
  • 太棒了,谢谢,还有一个问题。第一个解决方案是完美的,但如果我想要无限时间步长怎么办(我知道,理论问题是无限时间步调是愚蠢的)?然后,我必须使用您的第二个解决方案来重塑第一层的输出。但是,我用XOR的记忆序列做了一个简单的测试,当我改变输出时,网络并没有像我预期的那样对其作出反应。更好的说法是,它返回的输出与洗牌前相同。重塑究竟如何影响递归层的工作(与第一个解决方案相比)? 2017年9月16日18:56
  • 1
    重塑只是获取数据(任何数据),它只不过是一个被分段的数字的直序列。假设您有300个元素。当您像(30,10,1)那样重新塑造它们时,您只需以不同的方式分隔这300个元素。因此,如果您是为了序列目的而进行重塑,那么您必须知道要实现什么,以及数据的格式是什么,这样才能以一种重要的方式对其进行重塑。 2017年9月16日19:10
  • 对于无限序列,您可能只需要输入1个样本(BatchSize=1,TimeSteps,功能),并用stateful=真这意味着层将保持其内存,下一批将被视为以单个顺序继续上一批。在这种情况下,当您决定一个序列结束并开始输入另一个序列时,必须手动“擦除内存”(称为“重置状态”)。 2017年9月16日19:12
  • Daniel Möller谢谢。 2017年9月16日20:04

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.