在LSTM节点中访问内部遗忘门的值

6

我目前使用Keras创建了一个LSTM网络,并且需要获取每个节点的内部遗忘门值。我需要在每次调用predict()函数时获取遗忘门/值。是否有可能这样做?

如果不行,那么是否有其他库可以方便地在每一步中访问这些内部门值?

期待尽早得到帮助。

谢谢。

1个回答

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如何存储这些张量中的变量?文档没有指定任何信息,所以不幸的是,您将不得不参考源代码。查看LSTMCell类,特别是build(描述定义了哪些变量)和call(描述如何在计算中使用这些变量)方法。似乎内部参数存储在变量中,命名为*_i*_f*_c*_o(例如self.kernel_o)。

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

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


如果不行,那么是否有其他库可以方便地在每一步中访问这些内部门值呢?正如您所看到的,使用Tensorflow后端的Keras非常方便。我认为您不可能得到比这更方便的了。

无法访问实际值。我尝试以以下方式打印值 'print(variable_dict['lstm_1/kernel:0].kernel_f)'。这只给我形状而不是实际值。如何获取相同的实际值? - humble_me

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接