Keras SimpleRNN 混淆
Keras SimpleRNN confusion
...来自 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)
的输入层,然后是一个输出形状为 (None, 10)
的致密层。这是有道理的,因为 Keras 会自动为批处理添加第一个维度。
但是,下面的代码:
x = k.layers.Input(shape=(2,))
y = k.layers.SimpleRNN(10)(x)
m = k.models.Model(x, y)
引发异常 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)
...但是现在,当然,我的输入不再是 (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)
因为它 returns 整个序列而不仅仅是 "regular" RNN单元输出。
为什么需要这个?
此外:各州在哪里?他们只是默认为 1 个循环状态吗?
documentation 涉及 Keras 中循环组件的预期形状,让我们看看你的案例:
- Keras 中的任何 RNN 层都需要 3D 形状
(batch_size, timesteps, features)
。这意味着您有 timeseries 数据。
- RNN 层然后 迭代 使用循环单元的输入的第二个时间维度,即实际的循环计算。
- 如果你指定
return_sequences
那么你会收集每个时间步的输出,得到另一个 3D 张量 (batch_size, timesteps, units)
否则你只会得到最后一个输出 (batch_size, units)
.
现在回到您的问题:
- 你提到 vectors 但
shape=(2,)
是 a vector 所以这不起作用。 shape=(2,1)
有效,因为现在您有 2 个大小为 1 的向量,这些形状不包括 batch_size
。因此,要向您提供大小的向量,您需要 shape=(how_many_vectors, 2)
其中第一个维度是您希望 RNN 处理的向量数量,在这种情况下是时间步长。
- 要链接 RNN 层,您需要提供 3D 数据,因为这是 RNN 所期望的。当您指定
return_sequences
时,RNN 层 returns 在每个时间步输出,以便可以链接到另一个 RNN 层。
- 状态是 RNN 单元使用的向量集合,LSTM 使用 2,GRU 有 1 个隐藏状态,这也是输出。它们默认为 0,但可以在使用
initial_states=[...]
作为张量列表调用层时指定。
关于 Keras 中 RNN 层和 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)
...完美运行,根据 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)
引发异常 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)
...但是现在,当然,我的输入不再是 (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)
因为它 returns 整个序列而不仅仅是 "regular" RNN单元输出。
为什么需要这个?
此外:各州在哪里?他们只是默认为 1 个循环状态吗?
documentation 涉及 Keras 中循环组件的预期形状,让我们看看你的案例:
- Keras 中的任何 RNN 层都需要 3D 形状
(batch_size, timesteps, features)
。这意味着您有 timeseries 数据。 - RNN 层然后 迭代 使用循环单元的输入的第二个时间维度,即实际的循环计算。
- 如果你指定
return_sequences
那么你会收集每个时间步的输出,得到另一个 3D 张量(batch_size, timesteps, units)
否则你只会得到最后一个输出(batch_size, units)
.
现在回到您的问题:
- 你提到 vectors 但
shape=(2,)
是 a vector 所以这不起作用。shape=(2,1)
有效,因为现在您有 2 个大小为 1 的向量,这些形状不包括batch_size
。因此,要向您提供大小的向量,您需要shape=(how_many_vectors, 2)
其中第一个维度是您希望 RNN 处理的向量数量,在这种情况下是时间步长。 - 要链接 RNN 层,您需要提供 3D 数据,因为这是 RNN 所期望的。当您指定
return_sequences
时,RNN 层 returns 在每个时间步输出,以便可以链接到另一个 RNN 层。 - 状态是 RNN 单元使用的向量集合,LSTM 使用 2,GRU 有 1 个隐藏状态,这也是输出。它们默认为 0,但可以在使用
initial_states=[...]
作为张量列表调用层时指定。
关于 Keras 中 RNN 层和 RNN 单元之间的区别,已经有