gpt4 book ai didi

python - Keras SimpleRNN 混淆

转载 作者:行者123 更新时间:2023-11-28 18:11:44 25 4
gpt4 key购买 nike

...来自 TensorFlow,其中几乎所有形状和所有内容都已明确定义,我对 Keras 用于循环模型的 API 感到困惑。让 Elman 网络在 TF 中工作非常容易,但 Keras 拒绝接受正确的形状...

例如:

x = k.layers.Input(shape=(2,))
y = k.layers.Dense(10)(x)
m = k.models.Model(x, y)

...完美地工作,根据 model.summary() 我得到一个形状为 (None, 2) 的输入层,然后是一个带有输出的密集层形状 (无,10)。这是有道理的,因为 Keras 会自动为批处理添加第一个维度。

但是,下面的代码:

x = k.layers.Input(shape=(2,))
y = k.layers.SimpleRNN(10)(x)
m = k.models.Model(x, y)

引发异常 ValueError:输入 0 与层 simple_rnn_1 不兼容:预期 ndim=3,发现 ndim=2

只有在我添加另一个维度时它才有效:

x = k.layers.Input(shape=(2,1))
y = k.layers.SimpleRNN(10)(x)
m = k.models.Model(x, y)

...但是现在,当然,我的输入不再是(None, 2)

model.summary():

_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_1 (InputLayer) (None, 2, 1) 0
_________________________________________________________________
simple_rnn_1 (SimpleRNN) (None, 10) 120
=================================================================

当我只想将具有 2 个值的向量馈送到网络时,如何获得类型为 batch_size x 2 的输入?

此外,我将如何链接 RNN 单元?

x = k.layers.Input(shape=(2, 1))
h = k.layers.SimpleRNN(10)(x)
y = k.layers.SimpleRNN(10)(h)
m = k.models.Model(x, y)

...引发与不兼容暗尺寸相同的异常。

这里的示例有效:

x = k.layers.Input(shape=(2, 1))
h = k.layers.SimpleRNN(10, return_sequences=True)(x)
y = k.layers.SimpleRNN(10)(h)
m = k.models.Model(x, y)

...但是 h 层不再输出 (None, 10),但是 (None, 2, 10) 因为它返回整个序列,而不仅仅是“常规”RNN 单元输出。

为什么需要这个?

此外:状态在哪里?他们只是默认为 1 个循环状态吗?

最佳答案

documentation触及 Keras 中循环组件的预期形状,让我们看看您的案例:

  1. Keras 中的任何 RNN 层都需要一个 3D 形状(batch_size, timesteps, features)。这意味着您拥有时间序列数据。
  2. 然后,RNN 层使用循环单元对输入的第二个时间维度进行迭代,即实际的循环计算。
  3. 如果您指定return_sequences,那么您会收集每个时间步长的输出,得到另一个 3D 张量 (batch_size, timesteps, units) 否则您只会得到最后一个输出,即 (batch_size, units).

现在回到你的问题:

  1. 您提到了向量,但shape=(2,) 向量,所以这行不通。 shape=(2,1) 有效,因为现在您有 2 个大小为 1 的向量,这些形状不包括 batch_size。因此,要向您提供一定大小的向量,您需要 shape=(how_many_vectors, 2),其中第一个维度是您希望 RNN 处理的向量数量,在本例中为时间步长。
  2. 要链接 RNN 层,您需要提供 3D 数据,因为这是 RNN 所期望的。当您指定 return_sequences 时,RNN 层会在每个时间步返回输出,以便可以链接到另一个 RNN 层。
  3. 状态是 RNN 单元使用的向量集合,LSTM 使用 2,GRU 有 1 个隐藏状态,这也是输出。它们默认为 0,但可以在使用 initial_states=[...] 作为张量列表调用层时指定。

已经有一个post关于 Keras 中 RNN 层和 RNN 单元之间的区别,这可能有助于进一步阐明情况。

关于python - Keras SimpleRNN 混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50615323/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com