从零开始学人工智能(31)--Python · cv2(一)· 神经网络的可视化

浏览: 1020

作者:射命丸咲    Python 与 机器学习 爱好者

知乎专栏:https://zhuanlan.zhihu.com/carefree0910-pyml 

个人网站:http://www.carefree0910.com 


========== 写在前面的话 ==========

本章我尝试了一种新的叙述方式:把细节都放在了这个 repo (https://github.com/carefree0910/MLPractices)中,这意味着我不会在这里给出具体的代码;同时我设计了一些练习并提供了参考答案(有点像 cs231n 的 assignment 那种形式),所以如果观众老爷们想了解实现细节的话、是需要下载(或者 fork)这个 repo  并使用某个 IDE(比如 PyCharm)来进行相关实验的……

如果觉得这些都无所谓并愿意看的话,我会觉得很开心的 _(:з」∠)_

另外如果觉得这个形式不好或者没有必要的话也请尽情指出,毕竟这种形式对我而言其实超累的,要进行各种抽象 _(:з」∠)_

========== 分割线的说 ==========

正如上一章所说,这一部分我是受了 Tensorflow Playground 的启发后做出来的。它可能称不上很实用,但个人认为它能帮助我们理解神经网络(NN)并让我们熟悉 cv2 的基本操作

本章会使用我个人用 Numpy 写的 NN 框架进行实验,但即使对其完全不了解也不会对食用本文造成困难;不过如果有观众老爷确实想了解的话,可以参见这里 (http://www.carefree0910.com/posts/d94622d/) ( σ'ω')σ

先展示一下结果(动图也可以猛戳这里(https://raw.githubusercontent.com/carefree0910/Resources/641e8228/NN.gif)观看):


然后理一下我们要做的事:

  • 该可视化是针对二维数据进行的,但类别数可以任意多

  • 把每一层每个神经元在二维平面上的激活情况展示出来;具体而言,应该将小于激活均值的部分用蓝色填充、其余部分用橙色填充

  • 把神经元之间的边按照如下规则画出:

    • 取出层与层之间权值矩阵image.png中绝对值最大的元素m

    • image.png中绝对值小于0.2m的元素所对应的边隐藏,这主要是为了防止图显得太乱(0.2 是我随意取的一个阈值,完全可以按需求把它换成其它数)

    • 若一条边对应的权值绝对值越大、则该边应该越粗

    • 若一条边对应的权值为负、则该边应为蓝色,否则应为橙色

  • 支持将动画保存下来(需要 imageio 库来导出 mp4、需要 FFmpeg 来转成 gif) 

看上去似乎很复杂的样子,但又正如上一章所说,我们只需要四个最基本的元素:字、线、圆、方就行,所以真的实现起来就会发现并不困难。为了让观众老爷们更有实感,我努力做了一些抽象并设计了一些练习,观众老爷可以尝试把相应部分进行实现并在自己的电脑上跑跑效果。repo(可能会持续更新)可以在这里下载(或者 fork)到,下面就说下怎么利用这个 repo

在这个 repo 的 NN/Practices/NNVis.py 中有本章所有需要补完的代码,参考答案则都可以在 NN/Answers/NNVis.py 中找到,测试则可以在 NN/Tests/NNVis.py 中进行;为了更有条理,我把任务分成了四份:

  • 获取每条线的颜色(对应于 get_colors 函数)

  • 获取每条线的粗细(对应于 get_line_info 函数)

  • 画出整张 NN 的可视化图(对应于 draw_detail_network 函数),这部分的任务又分为了三份:画个圈、写个字、连条线(……)

  • 把 cv2 默认的 BGR 图像转换成 imageio 需要的 RGB 图像(对应于 bgr2rgb 函数)

其中第三点的实现有些绕,这里稍微说明一下。首先要明确 draw_detail_network 函数接收的主要参数是什么:

  • 原始二维数据集的最小、最大值(它们能帮助我们定出可视化的范围)

  • NN 中的各个 Layer(它们能通过 shape 属性告诉我们每一层的神经元个数)

  • NN 中的各个权值矩阵(线的颜色、粗细都是根据权值来定出的)

  • 获取各层激活值的方法(从而能获得各个神经元的激活情况)

有了这些之后,我们只需:

  • 根据激活值获取 Neuron graphs,所谓 Neuron graph 就是上图中那一个个小正方形,Neuron graphs 就是装这些小正方形的数组

  • 根据 Neuron graphs 渲染 Canvas、亦即就是把每个 Neuron graph 放到 Canvas 上合适的地方

  • 在把 Neuron graph(那些小正方形)画好之后,只需再进行如下三步即可完成可视化:

    • 把最上面代表输入的两个圈画出来

    • 把每个 Layer 的名字放在左边

    • 用合适的线把 Neuron graph 连起来

整个流程不难但繁,详情可参见 repo

希望观众老爷们能够喜欢~


公众号后台回复关键词学习

回复 人工智能          揭开人工智能的神秘面纱

回复 贝叶斯算法      贝叶斯算法与新闻分类

回复 机器学习          R&Python机器学习

回复 阿里数据          阿里数据系列课程

回复 Python            Python机器学习案例实战

回复 Spark              征服Spark第一季

回复 kaggle             机器学习kaggle案例

回复 大数据             大数据系列视频

回复 数据分析         数据分析人员的转型

回复 数据挖掘         数据挖掘与人工智能

回复 机器学习         R&Python机器学习

回复 阿里数据         阿里数据系列课程

回复 R                     R&Python机器学习入门


推荐 0
本文由 人工智能爱好者社区 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册