使用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网络结构分析「建议收藏」 


结束!

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 内存调试MEMWATCH

    内存调试MEMWATCH
    内存调试-MEMWATCH
     
    MEMWATCH由JohanLindh编写,是一个开放源代码C语言内存错误检测工具,您可以自己下载它(请参阅本文后面部分的参考资料)。只要在代码中添加一个头文件并在gcc语句中定义了MEMWATCH之后,您就可以跟踪程序中的内存泄漏和错误了。MEMWATCH支持ANSIC,它提供结果日志纪录,能检测双重释放(double-free)、错误释放(erroneousfree)、没有释放的内存(unfreedmemo

  • 删除链表倒数第n个节点_单向链表删除倒数第n节点

    删除链表倒数第n个节点_单向链表删除倒数第n节点原题链接给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。进阶:你能尝试使用一趟扫描实现吗?示例 1:输入:head = [1,2,3,4,5], n = 2输出:[1,2,3,5]示例 2:输入:head = [1], n = 1输出:[]示例 3:输入:head = [1,2], n = 1输出:[1]提示:链表中结点的数目为 sz1 <= sz <= 300 <= Node.val <= 1001 <= n <= s

  • Python 数据相关性分析

    Python 数据相关性分析概述在我们的工作中,会有一个这样的场景,有若干数据罗列在我们的面前,这组数据相互之间可能会存在一些联系,可能是此增彼涨,或者是负相关,也可能是没有关联,那么我们就需要一种能把这种关联性定量的工具来对数据进行分析,从而给我们的决策提供支持,本文即介绍如何使用Python进行数据相关性分析。关键词python方差协方差相关系数离散度pandasnumpy实验数据准备…

  • pycharm配置Python环境_手机虚拟环境怎么设置

    pycharm配置Python环境_手机虚拟环境怎么设置问题由来从github下载的模型程序,所适包的版本不同,导致Pycharm中包混乱、版本冲突。 为每个程序单独创建虚拟环境,使得特定程序只能访问虚拟环境中的包,从而保持全局解释器的干净整洁。创建虚拟环境File-Settings-PythonInterpreter-设置图标,后续设置如下:Pycharm之创建虚拟环境在特定虚拟环境中安装包1、选择下方Terminal2、利用cd进入项目的Scripts文件夹3、输入activate4、利用pip命…

  • 姿态估计与行为识别(行为检测、行为分类)的区别[通俗易懂]

    姿态估计与行为识别(行为检测、行为分类)的区别[通俗易懂]姿态估计和行为识别作为计算机视觉的两个领域,对于新人来说,较为容易弄混姿态估计和行为识别两个概念。 姿态估计(PoseEstimation)是指检测图像和视频中的人物形象的计算机视觉技术,可以确定某人的某个身体部位出现在图像中的位置,也就是在图像和视频中对人体关节的定位问题,也可以理解为在所有关节姿势的空间中搜索特定姿势。简言之,姿态估计的任务就是重建人的关节和肢干,其难点主要在于…

  • eclipse javadoc快捷键_mac系统截图快捷键

    eclipse javadoc快捷键_mac系统截图快捷键Mac下EclipseJava快捷键

    2022年10月30日

发表回复

您的电子邮箱地址不会被公开。

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