Python 如何在Keras/TensorFlow中可视化RNN/LSTM权重?

Python 如何在Keras/TensorFlow中可视化RNN/LSTM权重?,python,tensorflow,keras,visualization,recurrent-neural-network,Python,Tensorflow,Keras,Visualization,Recurrent Neural Network,我遇到过研究出版物和问答讨论检查RNN重量的必要性;一些相关的答案是正确的,建议获取权重()——但我如何真正有意义地可视化权重?也就是说,LSTM和GRU都有门,所有RNN都有作为独立特征提取器的通道-那么我如何(1)获取每个门的权重,以及(2)以信息丰富的方式绘制它们呢 Keras/TF以定义良好的顺序构建RNN权重,可以从源代码或通过层进行检查。直接-然后用于获取每个内核和每个门权重;然后,在给定张量形状的情况下,可以采用每通道处理。下面的代码和解释涵盖了Keras/TF RNN的每一种可能

我遇到过研究出版物和问答讨论检查RNN重量的必要性;一些相关的答案是正确的,建议
获取权重()
——但我如何真正有意义地可视化权重?也就是说,LSTM和GRU都有门,所有RNN都有作为独立特征提取器的通道-那么我如何(1)获取每个门的权重,以及(2)以信息丰富的方式绘制它们呢

Keras/TF以定义良好的顺序构建RNN权重,可以从源代码或通过
层进行检查。直接-然后用于获取每个内核和每个门权重;然后,在给定张量形状的情况下,可以采用每通道处理。下面的代码和解释涵盖了Keras/TF RNN的每一种可能情况,并且应该可以很容易地扩展到任何未来的API更改

另请参见可视化RNN梯度和应用程序;与前一篇文章不同的是,我不会在这里包含一个简化的变体,因为根据权重提取和组织的性质,它仍然是相当大和复杂的;相反,只需查看存储库中的相关源代码(请参阅下一节)


代码源:(这篇文章包括了更大的图片),我的存储库;包括:

  • 激活可视化
  • 权重可视化
  • 激活梯度可视化
  • 权重梯度可视化
  • 解释所有功能的文档字符串
  • 对keras中的Eager、Graph、TF1、TF2和
    的支持
  • 比示例中所示的视觉可定制性更强

可视化方法

  • 2D热图:绘制每个门、每个核、每个方向的重量分布;清楚地显示内核到隐藏的关系
  • 直方图:绘制每个门、每个核、每个方向的权重分布;丢失上下文信息

ex1:uni-LSTM,256个单位,重量--
批次形状=(16100,20)
(输入)
rnn\U直方图(模型“lstm”,相等轴=假,显示偏差=假)

rnn\u直方图(模型“lstm”,相等轴=真,显示偏差=假)

rnn\U热图(型号为“lstm”)

  • 上图是一个直方图子图网格,显示每个内核的权重分布,以及每个内核内每个门的权重分布
  • 第二个绘图集
    equale_axes=True
    用于在内核和门之间进行均匀比较,提高了比较质量,但可能会降低视觉吸引力
  • 最后一个图是具有相同权重的热图,栅极间隔由垂直线标记,偏差权重也包括在内
  • 与直方图不同,热图保留通道/上下文信息:可以清楚地区分隐藏和隐藏到隐藏变换矩阵的输入
  • 注意最大值集中在遗忘门处;作为琐事,在Keras中(通常),偏置门都初始化为零,除了忘记偏置,它初始化为1


ex2:bi-CuDNNLSTM,256个单位,重量--
批次形状=(16100,16)
(输入)
rnn\u直方图(模型“bidir”,相等轴=2)

rnn\U热图(型号'bidir',标准=(.8.8))

  • 双向是由两者支持的;本例中包含的直方图偏差
  • 再次注意偏差热图;他们似乎不再像EX 1那样居住在同一地点。事实上,
    CuDNNLSTM
    (和
    CuDNNGRU
    )偏差的定义和初始化是不同的——这是无法从直方图中推断出来的


ex3:uni-cudngru,64个单位,权重梯度--
批次形状=(16,100,16)
(输入)
rnn\U热图(型号'gru',模式'grads',输入数据=x,标签=y,cmap=None,绝对值=True)

  • 我们可能希望可视化梯度强度,这可以通过
    绝对值=True
    和灰度彩色贴图来实现
  • 在本例中,即使没有明确的分隔线,闸门分离也很明显:
    • New
      是最活跃的内核门(输入到hidden),建议在允许信息流方面进行更多的错误更正
    • Reset
      是最不活跃的循环门(从隐藏到隐藏),表明在内存保持方面的错误纠正最少


额外示例:LSTM NaN检测,512个单位,重量--
批次形状=(16,100,16)
(输入)

  • 热图和直方图都带有内置的NaN检测——内核、门和方向
  • 热图将把NAN打印到控制台,而直方图将直接在绘图上标记它们
  • 两者都会在打印前将NaN值设置为零;在下面的示例中,所有相关的非NaN权重都已为零

首先,干得好!然而,仔细看这篇文章,我觉得这是一个很好的工具,可以用来调试监控序列模型是否存在任何不良行为/错误。但这里有可解释性成分吗?例如,你能从模型所学内容的可视化中提取见解吗?@thushv89谢谢;这是一个很好的问题,但尽管我自己在寻找,却没有令人满意的答案。时间序列和图像之间的主要区别在于前者建模一个过程,而后者建模一个状态,因此信号信息本质上更复杂。信号分析,当然是主要的工具包,但对于NNs来说还不完整——是我在这个主题上找到的最好的材料。(澄清:“信号”假设与信号数据一起工作-否则对于NLP和单词嵌入,内容会进一步复杂化)@thushv89 repo更适合解释性,实际上是authore