【问题标题】:How can we get weights after training RNN in Keras?在 Keras 中训练 RNN 后如何获得权重?
【发布时间】:2018-09-24 09:18:25
【问题描述】:

我在 Keras 中训练了一个 RNN。现在,我想得到训练权重的值:

model = Sequential() 
model.add(SimpleRNN(27, return_sequences=True , input_shape=(None, 27), activation = 'softmax'))<br>
model.compile(loss='categorical_crossentropy',
          optimizer='rmsprop',
          metrics=['accuracy'])
model.get_weights()

这给了我 2 个形状 (27,27) 的数组和 1 个形状 (27,1) 的数组。我没有得到这些数组的含义。另外,我应该再得到 2 个形状数组 (27,27)(27,1),它们将计算隐藏状态“a”激活。我怎样才能得到这些权重?

【问题讨论】:

    标签: neural-network deep-learning keras lstm rnn


    【解决方案1】:

    model.get_weights() 返回的数组直接对应SimpleRNNCell 使用的权重。它们包括:

    • kernel 矩阵大小为(input_shape[-1], units)。在你的情况下,input_shape=(None, 27)units=27,所以它是(27, 27)。内核乘以input
    • recurrent_kernel 矩阵大小为(units, units),也恰好是(27, 27)。这个矩阵乘以之前的状态。
    • 形状为(units,) == (27,)的偏置数组。

    这些数组对应标准公式:

    # W = kernel
    # U = recurrent_kernel
    # B = bias
    output = new_state = act(W * input + U * state + B)
    

    请注意,keras 实现使用单个偏置向量,因此总共正好有三个数组。

    【讨论】:

    • 要计算输出,我们必须将 new_state 与 output_kernel 和 output_bias 相乘。输出 = act(Out_kernel * new_state + By)
    • 所以,我们应该有 3 个大小为 (27, 27) 的内核和 2 个大小为 (27, 1) 的偏差
    • 这不是简单的 RNN 单元的工作方式。正确的公式就在答案中。唯一拥有超过 3 个参数数组的库是 pytorch——它们使用两个偏置向量和两个内核。 Keras 使用单个偏置向量。请参阅此讨论:datascience.stackexchange.com/a/30317/18375
    猜你喜欢
    • 2017-10-07
    • 1970-01-01
    • 2020-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-11
    • 1970-01-01
    相关资源
    最近更新 更多