- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我遇到过研究出版物和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 keras
和from tf.keras
比示例中显示的视觉定制性更好
可视化方法:
2D热图:绘制每个门,每个内核,每个方向的重量分布;清楚显示内核与隐藏的关系
直方图:绘制每个门,每个内核,每个方向的权重分布;丢失上下文信息
EX 1:uni-LSTM,256个单位,重量-batch_shape = (16, 100, 20)
(输入)rnn_histogram(model, 'lstm', equate_axes=False, show_bias=False)
rnn_histogram(model, 'lstm', equate_axes=True, show_bias=False)
rnn_heatmap(model, 'lstm')
顶部图是直方图子图网格,显示每个内核以及每个门内每个内核内的权重分布
第二个图集equate_axes=True
用于在内核和门之间进行均匀比较,提高了比较质量,但可能会降低视觉吸引力
最后一个图是相同权重的热图,栅极间隔由垂直线标记,并且还包括偏置权重
与直方图不同,热图保留通道/上下文信息:可以清楚地区分输入到隐藏和隐藏到隐藏的转换矩阵
请注意,“忘记”门处的最大值集中很大;作为琐事,在Keras中(通常),偏置门都初始化为零,而“忘记偏置”则初始化为零。
EX 2:bi-CuDNNLSTM,256单位,重量-batch_shape = (16, 100, 16)
(输入)rnn_histogram(model, 'bidir', equate_axes=2)
rnn_heatmap(model, 'bidir', norm=(-.8, .8))
双向都支持双向;此示例中包含的直方图偏差
再次注意偏置热图;它们似乎不再与EX 1中位于相同的位置。实际上,CuDNNLSTM
(和CuDNNGRU
)偏差的定义和初始化方式不同-无法从直方图推断出
EX 3:uni-CuDNNGRU,64个单位,权重梯度-batch_shape = (16, 100, 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, 100, 16)
(输入)
热图和直方图都带有内置的NaN检测-内核,门和方向
热图将打印NaN到控制台,而直方图将直接在绘图上标记它们
两者都将在绘制之前将NaN值设置为零;在下面的示例中,所有相关的非NaN权重已经为零
关于python - 如何在Keras/TensorFlow中可视化RNN/LSTM权重?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59275959/
我是一名优秀的程序员,十分优秀!