从Tensorflow模型文件中解析并显示网络结构图(CKPT模型篇)

2023-10-29 11:50

本文主要是介绍从Tensorflow模型文件中解析并显示网络结构图(CKPT模型篇),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近看到一个巨牛的人工智能教程,分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家。平时碎片时间可以当小说看,【点这里可以去膜拜一下大神的“小说”】。

上一篇文章《从Tensorflow模型文件中解析并显示网络结构图(pb模型篇)》中介绍了如何从pb模型文件中提取网络结构图并实现可视化,本文介绍如何从CKPT模型文件中提取网络结构图并实现可视化。理论上,既然能从pb模型文件中提取网络结构图,CKPT模型文件自然也不是问题,但是其中会有一些问题。

1 解析CKPT网络结构

解析CKPT网络结构的第一步是读取CKPT模型中的图文件,得到图的Graph对象后即可得到完整的网络结构。读取图文件示例代码如下所示。

    saver = tf.train.import_meta_graph(ckpt_path+'.meta',clear_devices=True)graph = tf.get_default_graph()with tf.Session( graph=graph) as sess:sess.run(tf.global_variables_initializer()) saver.restore(sess,ckpt_path) 

调用graph.get_operations() 后即可得到当前图的所有计算节点,在利用Operation对象与Tensor对象之间的相互引用关系即可推断网络结构。但是需要注意的是,从meta文件中导入的图中获取计算节点存在如下问题。

  1. 包含反向梯度下降计算的所有节点
  2. 某些计算节点是按基础计算(加减乘除等)节点拆分成多个计算节点的,如BatchNorm,但其实是可以直接合并成一个节点的。

pb模型文件可以避免上面第一个问题,将CKPT模型转pb模型后,可以自动将反向梯度下降相关计算节点移除。对于第二点,pb模型文件会自动将基础计算组成一个计算节点,但是对于Tensor操作的函数如Slice等函数是无法合并的。因此,对于第2个问题,将CKPT模型转pb模型后,可以减少这类问题,但是无法避免。彻底避免的方法只能通过自己针对性地实现。经过以上分析,得出的结论是非常有必要将CKPT模型转pb模型。

2 自动将CKPT转pb,并提取网络图中节点

如果将CKPT自动转pb模型,那么就可以复用上一篇文章《从Tensorflow模型文件中解析并显示网络结构图(pb模型篇)》的代码。示例代码如下所示。

def read_graph_from_ckpt(ckpt_path,input_names,output_name ):   saver = tf.train.import_meta_graph(ckpt_path+'.meta',clear_devices=True)graph = tf.get_default_graph()with tf.Session( graph=graph) as sess:sess.run(tf.global_variables_initializer()) saver.restore(sess,ckpt_path) output_tf =graph.get_tensor_by_name(output_name) pb_graph = tf.graph_util.convert_variables_to_constants( sess, graph.as_graph_def(), [output_tf.op.name]) with tf.Graph().as_default() as g:tf.import_graph_def(pb_graph, name='')  with tf.Session(graph=g) as sess:OPS=get_ops_from_pb(g,input_names,output_name)return OPS

其中函数get_ops_from_pb在上一篇文章《从Tensorflow模型文件中解析并显示网络结构图(pb模型篇)》中已经实现。

3 测试

以《MobileNet V1官方预训练模型的使用》文中介绍的MobileNet V1网络结构为例,下载MobileNet_v1_1.0_192文件并压缩后,得到mobilenet_v1_1.0_192.ckpt.data-00000-of-00001mobilenet_v1_1.0_192.ckpt.indexmobilenet_v1_1.0_192.ckpt.meta文件。我们还需要知道mobilenet_v1_1.0_192.ckpt模型对应的输入和输出Tensor对象的名称,官方提供的压缩包文件中并没有告知。一种方法是运行官方代码,把输入Tensor的名称打印出来。但是运行官方代码本身就需要一定的时间和精力,在在上一篇文章《从Tensorflow模型文件中解析并显示网络结构图(pb模型篇)》的代码实现中已经实现了将原始网络结构对应的字符串写入到ori_network.txt文件中。因此,可以先随意填写输入名称和输出名称,待生成ori_network.txt文件后,从文件中可以直观看到原始网络结构。ori_network.txt文件部分内容如下所示。

ori_network.txt文件部分内容
通过该文件可知,输入Tensor的名称为:batch:0,输出Tensor名称为:MobilenetV1/Predictions/Reshape_1:0。有了这些信息后,调用函数read_graph_from_ckpt得到静态图的节点列表对象ops,调用函数gen_graph(ops,"save/path/graph.html")后,在目录save/path中得到graph.html文件,打开graph.html后,显示结果如下。

读取并显示CKPT模型的图结构

4 源码地址

https://github.com/huachao1001/CNNGraph

如果您觉得本文对您有帮助,欢迎关注我【Python学习实战】,每天学习一点点,每天进步一点点。
长按关注【Python学习实战】

这篇关于从Tensorflow模型文件中解析并显示网络结构图(CKPT模型篇)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/300467

相关文章

Linux中shell解析脚本的通配符、元字符、转义符说明

《Linux中shell解析脚本的通配符、元字符、转义符说明》:本文主要介绍shell通配符、元字符、转义符以及shell解析脚本的过程,通配符用于路径扩展,元字符用于多命令分割,转义符用于将特殊... 目录一、linux shell通配符(wildcard)二、shell元字符(特殊字符 Meta)三、s

如何设置vim永久显示行号

《如何设置vim永久显示行号》在Linux环境下,vim默认不显示行号,这在程序编译出错时定位错误语句非常不便,通过修改vim配置文件vimrc,可以在每次打开vim时永久显示行号... 目录设置vim永久显示行号1.临时显示行号2.永www.chinasem.cn久显示行号总结设置vim永久显示行号在li

Golang的CSP模型简介(最新推荐)

《Golang的CSP模型简介(最新推荐)》Golang采用了CSP(CommunicatingSequentialProcesses,通信顺序进程)并发模型,通过goroutine和channe... 目录前言一、介绍1. 什么是 CSP 模型2. Goroutine3. Channel4. Channe

使用Python实现批量访问URL并解析XML响应功能

《使用Python实现批量访问URL并解析XML响应功能》在现代Web开发和数据抓取中,批量访问URL并解析响应内容是一个常见的需求,本文将详细介绍如何使用Python实现批量访问URL并解析XML响... 目录引言1. 背景与需求2. 工具方法实现2.1 单URL访问与解析代码实现代码说明2.2 示例调用

SSID究竟是什么? WiFi网络名称及工作方式解析

《SSID究竟是什么?WiFi网络名称及工作方式解析》SID可以看作是无线网络的名称,类似于有线网络中的网络名称或者路由器的名称,在无线网络中,设备通过SSID来识别和连接到特定的无线网络... 当提到 Wi-Fi 网络时,就避不开「SSID」这个术语。简单来说,SSID 就是 Wi-Fi 网络的名称。比如

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R

使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)

《使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)》在现代软件开发中,处理JSON数据是一项非常常见的任务,无论是从API接口获取数据,还是将数据存储为JSON格式,解析... 目录1. 背景介绍1.1 jsON简介1.2 实际案例2. 准备工作2.1 环境搭建2.1.1 添加

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五

在C#中合并和解析相对路径方式

《在C#中合并和解析相对路径方式》Path类提供了几个用于操作文件路径的静态方法,其中包括Combine方法和GetFullPath方法,Combine方法将两个路径合并在一起,但不会解析包含相对元素... 目录C#合并和解析相对路径System.IO.Path类幸运的是总结C#合并和解析相对路径对于 C

电脑显示hdmi无信号怎么办? 电脑显示器无信号的终极解决指南

《电脑显示hdmi无信号怎么办?电脑显示器无信号的终极解决指南》HDMI无信号的问题却让人头疼不已,遇到这种情况该怎么办?针对这种情况,我们可以采取一系列步骤来逐一排查并解决问题,以下是详细的方法... 无论你是试图为笔记本电脑设置多个显示器还是使用外部显示器,都可能会弹出“无HDMI信号”错误。此消息可能