代码之家  ›  专栏  ›  技术社区  ›  daniel451

凯拉斯·辛普伦困惑

  •  3
  • daniel451  · 技术社区  · 7 年前

    …来自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)
    

    ……但现在,当然,我的意见不会是 (无,2) 不再。

    模型摘要() :

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

    我怎样才能有类型的输入 batch_size X 2 当我只想给网络提供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 不输出 (无,10) 再也没有了,但是 (None, 2, 10) 因为它返回整个序列,而不仅仅是“常规”RNN单元输出。

    为什么要这么做?

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

    1 回复  |  直到 7 年前
        1
  •  1
  •   nuric    7 年前

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

    已经有一个 post 关于keras中rnn层与rnn细胞的差异,这可能有助于进一步阐明这一情况。