当 input_shape 指定为 3-d 时,Keras SimpleRNN 上的错误

Posted

技术标签:

【中文标题】当 input_shape 指定为 3-d 时,Keras SimpleRNN 上的错误【英文标题】:Error on Keras SimpleRNN when input_shape is specified to be 3-d 【发布时间】:2017-01-03 09:56:15 【问题描述】:

我正在尝试从 Keras 上的 SimpleRNN 上的文本进行训练。

在 Keras 中,我为 SimpleRNN 指定了一个非常简单的参数,如下所示:

model = Sequential()
model.add(SimpleRNN(output_dim=1, input_shape=(1,1,1))

我明白 input_shape 应该是 (nb_samples, timesteps, input_dim),和我的 train_x.shape 一样

所以我很惊讶我收到了以下错误。

Traceback (most recent call last):
  File "C:/Users/xxx/xxxx/xxx/xxx.py", line 262, in <module>
    model.add(SimpleRNN(output_dim=vocab_size, input_shape=train_x.shape))
  File "C:\Anaconda3\envs\py34\lib\site-packages\keras\models.py", line 275, in add
    layer.create_input_layer(batch_input_shape, input_dtype)
  File "C:\Anaconda3\envs\py34\lib\site-packages\keras\engine\topology.py", line 367, in create_input_layer
    self(x)
  File "C:\Anaconda3\envs\py34\lib\site-packages\keras\engine\topology.py", line 467, in __call__
    self.assert_input_compatibility(x)
  File "C:\Anaconda3\envs\py34\lib\site-packages\keras\engine\topology.py", line 408, in assert_input_compatibility
    str(K.ndim(x)))
Exception: Input 0 is incompatible with layer simplernn_1: expected ndim=3, found ndim=4

不知道为什么 keras 在只指定 3 时“发现 ndim=4”!

为了清楚起见,我的

train_x.shape = (73, 84, 400)

vocab_size=400

。只要输入 3d 及以上的 input_shape,我意识到会导致错误。

任何帮助将不胜感激!!! :))

【问题讨论】:

【参考方案1】:

您不应该在模型的输入形状中包含n_samples。因此,您必须为图层的输入形状指定一个大小为 2 的元组(或将形状的第一个元素设置为 None)。这里 Keras 会自动将None 添加到您的输入形状中,从而生成ndim=4。 有关这方面的更多信息,请访问 here。

您的input_dim=400(假设您使用词汇表中单词的单热编码表示)并且您的训练数据似乎由73 文本(非常小)组成,每个文本的长度为84。所以你可能应该设置input_shape=(84,400).

【讨论】:

是的!你说的对!我花了一段时间才弄清楚这一点!谢谢你的帮助!! @snowflake 所以如果它解决了问题,请考虑接受答案。

以上是关于当 input_shape 指定为 3-d 时,Keras SimpleRNN 上的错误的主要内容,如果未能解决你的问题,请参考以下文章

Keras Layer 的 call(x) 和 input_shape

Keras: input_shape函数

自定义层中构建的继承 (super().build(input_shape))

Input_shape在自定义图层中为None

Conv1D 层 Keras 的 input_shape

Shell 判断语句