使用netron对mnist网络结构分析「建议收藏」

使用netron对mnist网络结构分析「建议收藏」基于libonnx环境简要分析一下mnist网络算子结构,关于环境搭建可以参考前面两篇文章:xboot大神的libonnx环境搭建使用netron实现对onnx模型结构可视化本文主要目的是搞清楚mnist各层之间数据shape的变化情况,关于什么是shape,引用一本书中的介绍:”在tensorflow中,使用张量来表示计算图中的所有数据,张量在计算图的节点之间流动,张量可以看成N维数组,而数组的维数就是张量的阶数。因此,0阶张量对应标量数据,1阶张量对应一维数组,也就是向量。二阶张量对应二

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

基于libonnx环境简要分析一下mnist网络算子结构,关于环境搭建可以参考前面两篇文章:

xboot大神的libonnx环境搭建

使用netron实现对onnx模型结构可视化


本文主要目的是搞清楚mnist各层之间数据shape的变化情况,关于什么是shape,引用一本书中的介绍:

“在tensorflow中,使用张量来表示计算图中的所有数据,张量在计算图的节点之间流动,张量可以看成N维数组,而数组的维数就是张量的阶数。因此,0阶张量对应标量数据,1阶张量对应一维数组,也就是向量。二阶张量对应二维数组,也就是矩阵,以此类推,N阶张量对应n维数组,例如,一张RGB图像可以表示为3阶张量,而多张RGB图构成的数据可以表示为4阶张量。shape(形状)代表的就是张量的一种属性,当然还有其他属性,比如数据类型等等”

再算子执行前面打断点,依次观察输入数据和输出数据的大小:

(gdb) b 2124
Breakpoint 2 at 0x555555560ef8: file onnx.c, line 2124.
(gdb) display n->inputs[0]->ndata
(gdb) display n->outputs[0]->ndata
(gdb) c
Continuing.
Breakpoint 2, onnx_run (ctx=0x555555a501e0) at onnx.c:2124
2124					n->operator(n);
1: n->inputs[0]->ndata = 2560
2: n->outputs[0]->ndata = 2560
(gdb) c
Continuing.

Breakpoint 2, onnx_run (ctx=0x555555a501e0) at onnx.c:2124
2124					n->operator(n);
1: n->inputs[0]->ndata = 784
2: n->outputs[0]->ndata = 6272
(gdb) c
Continuing.

Breakpoint 2, onnx_run (ctx=0x555555a501e0) at onnx.c:2124
2124					n->operator(n);
1: n->inputs[0]->ndata = 6272
2: n->outputs[0]->ndata = 6272
(gdb) c
Continuing.

Breakpoint 2, onnx_run (ctx=0x555555a501e0) at onnx.c:2124
2124					n->operator(n);
1: n->inputs[0]->ndata = 6272
2: n->outputs[0]->ndata = 6272
(gdb) c
Continuing.

Breakpoint 2, onnx_run (ctx=0x555555a501e0) at onnx.c:2124
2124					n->operator(n);
1: n->inputs[0]->ndata = 6272
2: n->outputs[0]->ndata = 1568
(gdb) c
Continuing.

Breakpoint 2, onnx_run (ctx=0x555555a501e0) at onnx.c:2124
2124					n->operator(n);
1: n->inputs[0]->ndata = 1568
2: n->outputs[0]->ndata = 3136
(gdb) c
Continuing.

Breakpoint 2, onnx_run (ctx=0x555555a501e0) at onnx.c:2124
2124					n->operator(n);
1: n->inputs[0]->ndata = 3136
2: n->outputs[0]->ndata = 3136
(gdb) c
Continuing.

Breakpoint 2, onnx_run (ctx=0x555555a501e0) at onnx.c:2124
2124					n->operator(n);
1: n->inputs[0]->ndata = 3136
2: n->outputs[0]->ndata = 3136
(gdb) c
Continuing.

Breakpoint 2, onnx_run (ctx=0x555555a501e0) at onnx.c:2124
2124					n->operator(n);
1: n->inputs[0]->ndata = 3136
2: n->outputs[0]->ndata = 256
(gdb) c
Continuing.

Breakpoint 2, onnx_run (ctx=0x555555a501e0) at onnx.c:2124
2124					n->operator(n);
1: n->inputs[0]->ndata = 256
2: n->outputs[0]->ndata = 256
(gdb) c
Continuing.

Breakpoint 2, onnx_run (ctx=0x555555a501e0) at onnx.c:2124
2124					n->operator(n);
1: n->inputs[0]->ndata = 256
2: n->outputs[0]->ndata = 10
(gdb) c
Continuing.

Breakpoint 2, onnx_run (ctx=0x555555a501e0) at onnx.c:2124
2124					n->operator(n);
1: n->inputs[0]->ndata = 10
2: n->outputs[0]->ndata = 10
(gdb) c
Continuing.

可以看出一个简单的规律,就是前一级网络的输出size等于后一级网络的输入size.

对照网络,可以完全对应的上:

使用netron对mnist网络结构分析「建议收藏」

将shape打印出(由dims表示),可以看出和上图完全吻合。(图中一维向量表示为1*N,也看成2维的shape).

Breakpoint 3, onnx_run (ctx=0x5555559ff250) at onnx.c:2124
2124					n->operator(n);
1: n->inputs[0]->ndata = 2560
2: n->outputs[0]->ndata = 2560
3: n->inputs[0]->ndim = 4
4: n->outputs[0]->ndim = 2
(gdb) c
Continuing.

Breakpoint 3, onnx_run (ctx=0x5555559ff250) at onnx.c:2124
2124					n->operator(n);
1: n->inputs[0]->ndata = 784
2: n->outputs[0]->ndata = 6272
3: n->inputs[0]->ndim = 4
4: n->outputs[0]->ndim = 4
(gdb) c
Continuing.

Breakpoint 3, onnx_run (ctx=0x5555559ff250) at onnx.c:2124
2124					n->operator(n);
1: n->inputs[0]->ndata = 6272
2: n->outputs[0]->ndata = 6272
3: n->inputs[0]->ndim = 4
4: n->outputs[0]->ndim = 4
(gdb) c
Continuing.

Breakpoint 3, onnx_run (ctx=0x5555559ff250) at onnx.c:2124
2124					n->operator(n);
1: n->inputs[0]->ndata = 6272
2: n->outputs[0]->ndata = 6272
3: n->inputs[0]->ndim = 4
4: n->outputs[0]->ndim = 4
(gdb) c
Continuing.

Breakpoint 3, onnx_run (ctx=0x5555559ff250) at onnx.c:2124
2124					n->operator(n);
1: n->inputs[0]->ndata = 6272
2: n->outputs[0]->ndata = 1568
3: n->inputs[0]->ndim = 4
4: n->outputs[0]->ndim = 4
(gdb) c
Continuing.

Breakpoint 3, onnx_run (ctx=0x5555559ff250) at onnx.c:2124
2124					n->operator(n);
1: n->inputs[0]->ndata = 1568
2: n->outputs[0]->ndata = 3136
3: n->inputs[0]->ndim = 4
4: n->outputs[0]->ndim = 4
(gdb) 
Continuing.

Breakpoint 3, onnx_run (ctx=0x5555559ff250) at onnx.c:2124
2124					n->operator(n);
1: n->inputs[0]->ndata = 3136
2: n->outputs[0]->ndata = 3136
3: n->inputs[0]->ndim = 4
4: n->outputs[0]->ndim = 4
(gdb) 
Continuing.

Breakpoint 3, onnx_run (ctx=0x5555559ff250) at onnx.c:2124
2124					n->operator(n);
1: n->inputs[0]->ndata = 3136
2: n->outputs[0]->ndata = 3136
3: n->inputs[0]->ndim = 4
4: n->outputs[0]->ndim = 4
(gdb) 
Continuing.

Breakpoint 3, onnx_run (ctx=0x5555559ff250) at onnx.c:2124
2124					n->operator(n);
1: n->inputs[0]->ndata = 3136
2: n->outputs[0]->ndata = 256
3: n->inputs[0]->ndim = 4
4: n->outputs[0]->ndim = 4
(gdb) 
Continuing.

Breakpoint 3, onnx_run (ctx=0x5555559ff250) at onnx.c:2124
2124					n->operator(n);
1: n->inputs[0]->ndata = 256
2: n->outputs[0]->ndata = 256
3: n->inputs[0]->ndim = 4
4: n->outputs[0]->ndim = 2
(gdb) 
Continuing.

Breakpoint 3, onnx_run (ctx=0x5555559ff250) at onnx.c:2124
2124					n->operator(n);
1: n->inputs[0]->ndata = 256
2: n->outputs[0]->ndata = 10
3: n->inputs[0]->ndim = 2
4: n->outputs[0]->ndim = 2
(gdb) 
Continuing.

Breakpoint 3, onnx_run (ctx=0x5555559ff250) at onnx.c:2124
2124					n->operator(n);
1: n->inputs[0]->ndata = 10
2: n->outputs[0]->ndata = 10
3: n->inputs[0]->ndim = 2
4: n->outputs[0]->ndim = 2
(gdb) 
Continuing.

然后再以ndim为上限,索引dims,还是以reshape为例:

使用netron对mnist网络结构分析「建议收藏」

可以看出和netron解析的图中reshape模块的shape完全吻合:

使用netron对mnist网络结构分析「建议收藏」

使用netron对mnist网络结构分析「建议收藏」

使用netron对mnist网络结构分析「建议收藏」

darknet网络举例:

netron不但可以解析onnx格式的模型文件,还支持darknet中 .cfg格式的文件,比如:

使用netron对mnist网络结构分析「建议收藏」

 不过貌似N,C,W,H的排列有所差别,在上面mnist网络中,顺序是,个数X通道数X长度X高度

而darknet的cfg中,对于输出数据,是WxHxC的方式,也即是宽X长X通道号,但是对于每个算子节点,则是CXNXWXH的方式,也即是通道数在前,之后依次是个数,宽和长. N是batch size.

使用netron对mnist网络结构分析「建议收藏」

从最后一层的模型看不出它的结构,实际上它是一个全连接层:

使用netron对mnist网络结构分析「建议收藏」

这一点可以通过芯原的模型转换工具的转换结果看出来,芯原的转换工具,可以将ONNX模型转换为芯原NPU吃的json文件模型,而netron是支持此类型的可视化输出的。

以下模型是和上图同一个模型文件,转换为芯原格式的JSON模型文件后,通过NETRON分析得到的网络模型结构,可以看到,最后一层是全连接。

使用netron对mnist网络结构分析「建议收藏」


lenet 模型都需要对吃进去的图像做数据归一化,libonnx实现也不例外

使用netron对mnist网络结构分析「建议收藏」

使用netron对mnist网络结构分析「建议收藏」

使用netron对mnist网络结构分析「建议收藏」 

使用netron对mnist网络结构分析「建议收藏」

使用netron对mnist网络结构分析「建议收藏」 


结束!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/179595.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python和pythoncharm有什么区别_python为什么叫爬虫

    python和pythoncharm有什么区别_python为什么叫爬虫pycharm和python区别1、首先它们的下载地址和安装的方式不同;2、python是一种基本编译环境,就像java和jar一样。pycharm是一种集成开发环境,为了能够让你快速编写代…

    2022年8月29日
    1
  • javac 与 java的区别[通俗易懂]

    javac 与 java的区别[通俗易懂]java编译器名称是javac,是将源文件编译为字节码文件的程序,而java是java解释器的名称,也就是解释和执行字节码文件的程序。注意:::java源文件必须是具有  .java 扩展名java字节码文件必须具有  .class 扩展名 javac可以将java源文件编译为class字节码文件如javacHelloWorld.java运行javac命令后,如果成功编译没有错误的话…

    2022年5月15日
    56
  • CentOS下yum的安装及配置

    CentOS下yum的安装及配置一般公司都用Linux来搭建服务器,Linux安装软件时能够用yum安装依赖包是一件非常简单而幸福的事情,因为你只需一个简单的安装命令yuminstall[]即可安装相应的软件,yum工具会自动的从网上yum源中下载相应的依赖包,并以正确的依赖关系一个个安装依赖包。下面简单介绍一下CentOS下安装yum源的流程和操作。一、查看、卸载已安装的yum包1、查看已安装的yum包

    2022年6月3日
    87
  • 【转载】这才是真正的表扩展方案

    【转载】这才是真正的表扩展方案

    2021年11月20日
    50
  • 浅谈PO模式

    浅谈PO模式浅谈PO模式概述设计原则功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML图表FLowchart流程图导出与导入导出导入概述PO模式是自动化测试的一种常见设计思路,核心思想是通过对界面元素的封装减少冗余代码,同时在后期维护中,若元素定位发生变化,只需要调整页面元素封装的代码

    2022年5月13日
    60
  • Idea激活码永久有效Idea2020.1.3激活码教程-持续更新,一步到位

    Idea激活码永久有效Idea2020.1.3激活码教程-持续更新,一步到位Idea激活码永久有效2020.1.3激活码教程-Windows版永久激活-持续更新,Idea激活码2020.1.3成功激活

    2022年6月17日
    277

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号