热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

我遇到过许多研究出版物,Q&A讨论了检查RNN权重的必要性;一些相关的答案朝着

我遇到过许多研究出版物,Q&A讨论了检查RNN权重的必要性;一些相关的答案朝着正确的方向提出了建议get_weights()-但是我如何真正可视化权重有意义地?也就是说,LSTM和GRU具有,所有RNN具有通道作为独立的特征提取器-因此,我如何(1)提取每个门权重,然后(2)以信息方式绘制权重?


Keras / TF以明确定义的顺序构建RNN权重,可以从源代码中或直接通过layer.__dict__进行检查-然后用于获取每个内核的 每关权重;给定张量的形状,然后可以使用每通道处理。以下代码和说明涵盖了Keras / TF RNN的所有可能情况,并且应该可以轻松扩展到将来的任何API更改。

另请参见可视化RNN渐变以及对RNN regularization的应用;与前一篇文章不同,我不会在此处包括一个简化的变体,因为从重量提取和组织的本质来看,它仍然相当庞大和复杂;相反,只需在存储库中查看相关的源代码即可(请参阅下一节)。


代码源:See RNN(此文章包含大图),我的存储库;包括:


  • 激活可视化

  • 重量可视化

  • 激活梯度可视化

  • 重量梯度可视化

  • 说明所有功能的文档字符串

  • 支持Eager,Graph,TF1,TF2和from kerasfrom tf.keras

  • 比示例中显示的视觉自定义性更高



可视化方法


  • 二维热图:绘制每个门,每个内核,每个方向的重量分布; 清楚地显示了内核与隐藏的关系

  • 直方图:绘制每个门,每个内核,每个方向的权重分布; 丢失上下文信息



EX 1:uni-LSTM,256个单位,重量-batch_shape = (16,100,20)(输入)
rnn_histogram(model,'lstm',equate_axes=False,show_bias=False)
rnn_histogram(model,equate_axes=True,show_bias=False)
rnn_heatmap(model,'lstm')


  • 顶部图是直方图子图网格,显示每个内核以及每个内核中每个门的权重分布

  • 第二个图集equate_axes=True用于在内核和门之间进行均匀比较,提高了比较质量,但可能会降低视觉吸引力

  • 最后一幅图是具有相同权重的热图,其中栅极间隔由垂直线标记,并且还包括偏置权重

  • 与直方图不同,热图保留通道/上下文信息:可以清楚地区分输入到隐藏和隐藏到隐藏的转换矩阵

  • 请注意,在“忘记”门口大量集中了最大值;作为琐事,在Keras(通常是)中,除“忘记”偏置(初始化为1)之外,所有偏置门均初始化为零。


EX 2:bi-CuDNNLSTM,256个单位,重量-batch_shape = (16,16)(输入)
rnn_histogram(model,'bidir',equate_axes=2)
rnn_heatmap(model,norm=(-.8,.8))


    两者均支持双向。此示例中包含的直方图偏差
  • 再次注意偏差热图;它们似乎不再与EX 1中位于相同的位置。确实,CuDNNLSTM(和CuDNNGRU)偏差的定义和初始化方式不同-无法从直方图推断出这一点

enter image description here
enter image description here


EX 3:uni-CuDNNGRU,64个单位,权重梯度-batch_shape = (16,16)(输入)
rnn_heatmap(model,'gru',mode='grads',input_data=x,labels=y,cmap=None,absolute_value=True)


  • 我们可能希望可视化渐变强度,这可以通过absolute_value=True和灰度色图来实现

  • 在此示例中,即使没有显式的分隔线,
  • 门分隔也是显而易见的:

    • New是最活跃的内核门(输入到隐藏),建议对允许信息流
    • 进行更多的纠错
    • Reset是最不活跃的循环门(隐藏到隐藏),建议在内存保存方面的错误校正最少




Bonus EX:LSTM NaN检测,512个单位,权重-batch_shape = (16,16)(输入)


  • 热图和直方图都带有内置的NaN检测-内核,门和方向

  • Heatmap将打印NaN到控制台,而直方图会将其直接标记在图上

  • 两者都将在绘制之前将NaN值设置为零;在下面的示例中,所有相关的非NaN权重已经为零


推荐阅读
author-avatar
你问什么只为她停留_538
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有