Keras SimpleRNN 混淆

dan*_*451 6 python keras rnn

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

例如:

x = k.layers.Input(shape=(2,))
y = k.layers.Dense(10)(x)
m = k.models.Model(x, y)
Run Code Online (Sandbox Code Playgroud)

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

但是,以下代码:

x = k.layers.Input(shape=(2,))
y = k.layers.SimpleRNN(10)(x)
m = k.models.Model(x, y)
Run Code Online (Sandbox Code Playgroud)

引发异常ValueError: Input 0 is incompatible with layer simple_rnn_1: expected ndim=3, found ndim=2

仅当我添加另一个维度时才有效:

x = k.layers.Input(shape=(2,1))
y = k.layers.SimpleRNN(10)(x)
m = k.models.Model(x, y)
Run Code Online (Sandbox Code Playgroud)

...但现在,当然,我的意见不会(None, 2)了。

model.summary()

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

当我只想将具有 2 个值的向量提供给网络时,如何获得类型为batch_sizex的输入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)
Run Code Online (Sandbox Code Playgroud)

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

这里的示例有效:

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)
Run Code Online (Sandbox Code Playgroud)

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

为什么需要这个?

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

nur*_*ric 3

文档涉及 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_sequencesRNN 层在每个时间步返回输出时,以便可以链接到另一个 RNN 层。
  3. 状态是 RNN 单元使用的向量集合,LSTM 使用 2 个,GRU 有 1 个隐藏状态,这也是输出。initial_states=[...]它们默认为 0,但可以在使用张量列表调用层时指定。

已经有一篇文章介绍了 Keras 中 RNN 层和 RNN 单元之间的差异,这可能有助于进一步澄清情况。