计算GRU层(Keras)的参数数量

时间:2019-08-02 01:46:16

标签: tensorflow lstm gated-recurrent-unit

为什么GRU层的参数数是9600?

不是((16 + 32)* 32 + 32)* 3 * 2 = 9,408吗?

或重新排列

32 *(16 + 32 + 1)* 3 * 2 = 9408

model = tf.keras.Sequential([
    tf.keras.layers.Embedding(input_dim=4500, output_dim=16, input_length=200),
    tf.keras.layers.Bidirectional(tf.keras.layers.GRU(32)),
    tf.keras.layers.Dense(6, activation='relu'),
    tf.keras.layers.Dense(1, activation='sigmoid')
])
model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])
model.summary()

enter image description here

2 个答案:

答案 0 :(得分:3)

关键是当reset_after=True中的参数GRUCell时,张量流将为输入内核和循环内核分离偏差。您可以按照以下步骤查看GRUCell中的source code

if self.use_bias:
    if not self.reset_after:
        bias_shape = (3 * self.units,)
    else:
        # separate biases for input and recurrent kernels
        # Note: the shape is intentionally different from CuDNNGRU biases
        # `(2 * 3 * self.units,)`, so that we can distinguish the classes
        # when loading and converting saved weights.
        bias_shape = (2, 3 * self.units)

以复位门为例,我们通常看到以下公式。 enter image description here

但是,如果我们设置reset_after=True,则实际公式如下: enter image description here

如您所见,GRU的默认参数是reset_after=True中的tensorflow2。但是GRU的默认参数是reset_after=False中的tensorflow1.x

因此,GRU((16+32)*32 + 32 + 32) * 3 * 2 = 9600层的参数数应为tensorflow2

答案 1 :(得分:0)

除了已接受的答案外,我还想出了一些更多的信息。 Keras在GRUCell.call()中的工作是:

使用reset_after=False(在TensorFlow 1中为默认设置):

使用reset_after=True(在TensorFlow 2中为默认设置):

reset_after=False训练后,b_xh等于b_hzb_xr等于b_hrb_xh等于b_hh,因为(我假设)TensorFlow意识到这些向量对中的每对都可以组合为一个参数向量,就像上面的注释中指出的OP一样。但是,对于reset_after=Trueb_xh来说,不是 情况-它们可以并且将有所不同,因此它们可以不是组合成一个向量,这就是为什么总参数计数更高的原因。