【问题标题】:Access internal forget gate value in lstm node访问 lstm 节点中的内部遗忘门值
【发布时间】:2018-06-21 16:33:36
【问题描述】:

我目前使用 Keras 创建了一个 LSTM 网络,并且必须获取网络每个节点的内部遗忘门值。每次调用 predict() 函数时,我都必须获取忘记门/值。有可能吗?

如果没有,那么是否有任何其他库可以在每一步以方便的方式访问这些内部门值?

期待尽早在这方面提供一些帮助。 谢谢。

【问题讨论】:

    标签: python deep-learning keras lstm


    【解决方案1】:

    如何获取内部权重和参数?

    如果您使用KerasTensorflow 后端(这是推荐的后端),您可以使用tf.global_variables() 访问内部层值(如权重和偏差)。为方便起见,创建一个字典,将图层名称映射到相应的tf.Variable

    variable_dict = dict([])
    for variable in tf.global_variable():
        variable_dict[variable.name] = variable
    

    经过这个简单的映射后,您可以直接通过变量名来引用变量。 Keras 的LSTM 层(假设model.summary() 表明LSTM 层被命名为'lstm_1')具有以下内部变量:'lstm_1/kernel:0''lstm_1/recurrent_kernel:0''lstm_1/bias:0'。要获取它们的值,您需要对 Tensorflow 的 SessionTensor 对象有所了解。

    现在是棘手的部分:Keras 如何将变量存储在这些张量中?该文档没有指定任何有关它的信息,因此很遗憾您将不得不参考source code。查看LSTMCell 类,尤其是build(描述定义了哪些变量)和call(描述如何在计算中使用这些变量)方法。似乎内部参数存储在变量中,命名为*_i*_f*_c*_o(例如self.kernel_o)。


    如何在计算过程中获得中间值?

    很遗憾,您将不得不直接修改计算图。这比听起来容易:只需编辑 Tensorflow 的代码并将这些变量存储在全局范围内的命名张量中。


    如果没有,那么是否有任何其他库可以访问这些 以方便的方式在每一步的内部门值?

    如您所见,KerasTensorflow 后端非常方便。我认为没有比这更方便的了。

    【讨论】:

    • 无法访问实际值。我尝试以以下方式打印值'print(variable_dict['lstm_1/kernel:0].kernel_f)'。这只是给我形状而不是实际值。如何获得相同的实际值?
    猜你喜欢
    • 2017-01-03
    • 2020-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多