【问题标题】:Number of parameters for Keras SimpleRNNKeras SimpleRNN 的参数数量
【发布时间】:2018-05-02 12:09:05
【问题描述】:

我有一个SimpleRNN 喜欢:

model.add(SimpleRNN(10, input_shape=(3, 1)))
model.add(Dense(1, activation="linear"))

模型摘要说:

simple_rnn_1 (SimpleRNN)   (None, 10)   120       

我很好奇simple_rnn_1的参数号120

有人能回答我的问题吗?

【问题讨论】:

    标签: machine-learning keras deep-learning neural-network recurrent-neural-network


    【解决方案1】:

    当您查看表格的标题时,您会看到标题Param

    Layer (type)              Output Shape   Param 
    ===============================================
    simple_rnn_1 (SimpleRNN)   (None, 10)    120   
    

    此数字表示相应层中可训练参数(权重和偏差)的数量,在本例中为您的SimpleRNN

    编辑:

    权重计算公式如下:

    recurrent_weights + input_weights + 偏差

    *resp: (num_features + num_units)* num_units + num_units

    说明:

    num_units = 等于 RNN 中的单元数

    num_features = 等于您输入的特征数

    现在您的 RNN 中发生了两件事。

    首先,您有循环循环,其中状态被循环输入模型以生成下一步。循环步骤的权重是:

    recurrent_weights = num_units*num_units

    其次,您在每一步都有新的序列输入。

    input_weights = num_features*num_units

    (通常将最后一个 RNN 状态和新输入连接起来,然后乘以一个权重矩阵,但输入和最后一个 RNN 状态使用不同的权重)

    所以现在我们有了权重,缺少的是偏差 - 每个单位都有一个偏差:

    偏差 = num_units*1

    所以最后我们有了公式:

    recurrent_weights + input_weights + 偏差

    num_units* num_units + num_features* num_units + 偏差

    =

    (num_features + num_units)* num_units + 偏差

    在您的情况下,这意味着可训练的参数是:

    10*10 + 1*10 + 10 = 120

    我希望这是可以理解的,如果不只是告诉我 - 所以我可以编辑它以使其更清楚。

    【讨论】:

    • 我的问题是120这个数字是怎么来的。谢谢
    • 嗨,我还有一个问题。是多对一类型吗?我的意思是我们在 simpleRNN(10, input_shape=(3,1)) 之后使用 model.add(Dense(1))。这是否意味着在查看第三个数据后,模型使用 Dense(1) 从 simpleRNN 的 10 个输出中生成了一个输出?
    • 这有点离题,但是是的,它是多对一的。但是 10 个单位并不意味着它产生一个长度为 10 的序列,这只是维度 - 越高,您可以存储的信息越多,但它仍然只是一个输出。如果要使用多对多,则需要在 RNN 中设置 return_sequences=True。最后一层中Dense 单元的数量通常被认为是类的数量,而不是序列的输出。如果您想了解更多关于return_sequences 的信息,这里有一篇关于它的博文:machinelearningmastery.com/…
    • @MBT 你能解释一下吗?我无法理解。
    • recurrent term 和 input term 分别有独立的bias,所以一共有两个bias。因此,参数的数量是 10*10 + 1*10 + 10 +10 = 130。我说的对吗?
    【解决方案2】:

    使用这样的简单网络可能更容易直观地理解:

    权重数为 16 (4 * 4) + 12 (3 * 4) = 28,偏差数为 4。

    其中 4 是单元数,3 是输入维数,所以公式就像第一个答案中的一样:num_units ^ 2 + num_units * input_dim + num_units 或简单地num_units * (num_units + input_dim + 1),得出 10 * (10 + 1 + 1) = 120 对于问题中给出的参数。

    【讨论】:

    【解决方案3】:

    我把你添加的 SimpleRNN 可视化了,我觉得这个图可以解释很多。

    SimpleRNN layer,我是新手,不能直接发图,需要点击链接。

    从 SimpleRNN 层的展开版本来看,它可以看作是一个密集层。上一层是输入和当前层(上一步)本身的串联。

    所以SimpleRNN的参数个数可以计算为一个dense layer:

    num_para = units_pre * units + num_bias

    地点:

    units_pre 是输入神经元(在您的设置中设置为 1)和 units(见下文)的总和,

    units是当前层的神经元个数(你的设置是10个),

    num_bias是当前层的偏置项的个数,与units相同。

    插入您的设置,我们实现了 num_para = (1 + 10) * 10 + 10 = 120。

    【讨论】:

      猜你喜欢
      • 2019-09-21
      • 1970-01-01
      • 2018-11-09
      • 1970-01-01
      • 2020-04-13
      • 1970-01-01
      • 2016-12-31
      • 2021-07-09
      • 2018-12-23
      相关资源
      最近更新 更多