可视化 TFLite 图并获取特定节点的中间值?

2024-05-16

我想知道是否有办法知道 tflite 中特定节点的输入和输出列表?我知道我可以获得输入/输出详细信息,但这不允许我重建发生在Interpreter。所以我要做的是:

interpreter = tf.lite.Interpreter(model_path=model_path)
interpreter.allocate_tensors()

input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()
interpreter.get_tensor_details()

最后 3 个命令基本上给了我字典,但似乎没有必要的信息。

所以我想知道是否有办法知道每个节点输出的去向?一定Interpreter不知何故知道这一点。我们可以吗?谢谢。


Note:这个答案是为 Tensorflow 1.x 编写的,虽然概念和核心思想在 TensorFlow 2.x 中保持不变,但这个答案中的命令可能已被弃用。

TF-Lite 的机制使得检查图并获取内部节点的中间值的整个过程有点棘手。这get_tensor(...)其他答案建议的方法不起作用。

如何可视化 TF-Lite 推理图?

TensorFlow Lite 模型可以使用以下方式可视化可视化.py https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/tools/visualize.py脚本中的TensorFlow Lite 存储库 https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite。您只需要:

  • 克隆 TensorFlow 存储库 https://www.tensorflow.org/install/source

  • Run the visualize.py带有 bazel 的脚本:

      bazel run //tensorflow/lite/tools:visualize \
           model.tflite \
           visualized_model.html
    

我的 TF 模型中的节点在 TF-Lite 中是否具有等效节点?

NO!事实上,TF-Lite 可以修改您的图表,使其变得更加优化。以下是来自TF-Lite 文档 https://www.tensorflow.org/lite/guide/ops_compatibility:

许多 TensorFlow 操作都可以由 TensorFlow Lite 处理,尽管它们没有直接的等效项。这种情况可以简单地从图中删除(tf.identity)、用张量(tf.placeholder)替换或融合到更复杂的操作(tf.nn.bias_add)中。有时,甚至某些受支持的操作也可能会通过这些过程之一被删除。

此外,TF-Lite API目前不允许获取节点对应关系; TF-Lite 的内部格式很难解释。因此,即使没有下面的另一个问题,您也无法获得所需的任何节点的中间输出......

我可以获得某些 TF-Lite 节点的中间值吗?

NO!这里我就解释一下为什么get_tensor(...) https://www.tensorflow.org/api_docs/python/tf/lite/Interpreter#get_tensor在 TF-Lite 中不起作用。假设在内部表示中,图包含 3 个张量,以及中间的一些密集操作(节点)(您可以认为tensor1作为输入和tensor3作为模型的输出)。在这个特定图的推理过程中,TF-Liteonly需要 2 个缓冲区,让我们展示一下如何操作。

First, use tensor1计算tensor2通过应用dense手术。这只需要 2 个缓冲区来存储值:

           dense              dense
[tensor1] -------> [tensor2] -------> [tensor3]
 ^^^^^^^            ^^^^^^^
 bufferA            bufferB

Second,使用的值tensor2存储在bufferB计算tensor3... 可是等等!我们不需要bufferA不再了,所以让我们用它来存储值tensor3:

           dense              dense
[tensor1] -------> [tensor2] -------> [tensor3]
                    ^^^^^^^            ^^^^^^^
                    bufferB            bufferA

现在是棘手的部分。 “产值”为tensor1仍会指向bufferA,现在的值是tensor3。所以如果你打电话get_tensor(...) https://www.tensorflow.org/api_docs/python/tf/lite/Interpreter#get_tensor对于第一个张量,您将得到不正确的值。这该方法的文档 https://www.tensorflow.org/api_docs/python/tf/lite/Interpreter#get_tensor甚至指出:

该函数不能用于读取中间结果。

如何解决这个问题?

  • 简单但有限的方法。您可以指定节点的名称,以及要在转换期间获取其值的输出张量:

      tflite_convert \
          -- # other options of your model
          --output_arrays="output_node,intermediate/node/n1,intermediate/node/n2"
    
  • 困难但灵活的方式。您可以使用 Bazel 编译 TF-Lite(使用这条指令 https://www.tensorflow.org/install/source)。然后你实际上可以注入一些日志代码Interpreter::Invoke()在文件中tensorflow/lite/interpreter.cc。一个丑陋的黑客,但它有效。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

可视化 TFLite 图并获取特定节点的中间值? 的相关文章

随机推荐

  • 如何使用 SSIS 将多个 Access 数据库导入到 SQL Server

    我有一个文件夹 其中包含 300 多个 Access 数据库 由我无法控制的程序编写 它们都有相同的结构 只是一张表 我正在将数据导入到 SQL Server 2005 中的表中 使用导入向导效果很好 但它一次只能用于一个 Access 数
  • 最简单的 Ajax 照片库

    我不认为 最简单 是主观的 寻找一个可托管的照片库 除了显示图像并提供 下一张图像 和 上一张图像 之外什么也不做 但所有这些都无需重新加载页面 显然预缓存也很好 PHP Python Ruby 或 JS 如果你想要简单的 也许是这样的 d
  • RecyclerView 未显示列表中的所有项目

    我在用RecyclerView在我的应用程序中 每次我打开屏幕时 我只能看到一项 但当我调试时 它每次都会出现onBindViewHolder method 这是我的适配器 Override public ViewHolder onCrea
  • PHP语言问题

    我有一个 php 页面 它将邮件发送到特定电子邮件 其中包含此页面表单中的数据 邮件必须以网站的母语 阿拉伯语 发送 但是当我单击表单上的提交按钮时 收到的邮件一半可读 阿拉伯语 另一部分不可读 符号 我想知道如何解决这个问题并且能够发送邮
  • JSP:未评估 EL 表达式[重复]

    这个问题在这里已经有答案了 我有一个在 Tomcat 5 5 上运行的 JSP 页面 我有以下代码
  • BufferedInputStream 的使用

    让我在这篇文章的序言中提出一点警告 对于 Java 来说 我完全是个初学者 我断断续续地编写 PHP 有一段时间了 但我准备制作一个桌面应用程序 因此出于各种原因我决定使用 Java 我正在开发的应用程序处于开始阶段 少于 5 个类 我需要
  • JPA 和 PostqreSQL:长字符串持久化

    谁能告诉我如何使用 JPA 保存长文本 我使用 PostgreSQL 这是我在类中定义很长字符串的方法 Lob private String body 然而 这会产生一个类型的字段字符变化 255 在数据库中 此外 我尝试使用 Column
  • Airflow 默认连接数过多

    我打开气流并检查连接 发现其后面运行的连接太多 关于如何杀死那些我不使用的任何想法 或者我很想知道运行它的最小 conn id 建筑学 LocalExecutor 与其他经纪人不同 Postgres 作为元数据库 但它列出了 17 个连接
  • POD 结构或标准布局类型的成员是否保证根据其对齐要求进行对齐?

    给定一个 POD 结构 在 C 03 中 或一个标准布局类型 在 C 11 中 所有成员都有基本对齐要求 是否可以保证每个成员都根据其对齐要求进行对齐 换句话说 对于所有成员m k in m0 mn标准布局类型的 S struct S T0
  • 鼠标监听器帮助 Java

    我正在尝试用 Java Swing 编写一个程序 输出一个 10 x 10 的几何矩形网格 其中填充了随机颜色 但是 当用户单击显示窗口中的一个矩形时 该矩形应重新绘制 并更改为另一种颜色 到目前为止 我已经运行了基本程序 但我不知道如何对
  • 生产中偶尔会发生 android.webkit.WebView 类膨胀错误

    我的应用程序在 Google Play 上 它在大多数设备 数千个用户 上运行良好 但在极少数情况下 占每日活跃用户百分比的一小部分 我得到Error inflating class android webkit WebView当我为我的片
  • 从 Java 执行 .app 文件夹?

    有没有一种合理的方法可以直接从 Java 执行 app 目录 而不是深入查找二进制文件 我有一个带有一些首选项的应用程序 其中包括用于打开各种内容的外部程序 如果在 OSX 上用户可以只选择 app 文件夹 那就太好了 我可以查找 app
  • 如何为图层阴影不透明度设置动画?

    我有一个视图 我已将 LayerOpacity 设置为 1 theView layer shadowOpacity 1 0 当视图位于屏幕下方时 这看起来很好 当我将此视图向上移动以与另一个有阴影的视图齐平时 它们看起来不太好 有没有办法让
  • IntelliJ - 从测试覆盖率报告中排除某些类(包)

    我目前正在使用 Java 和 Play 框架 我有 JUnit 测试 并且正在尝试使用 IntelliJ 覆盖率运行器来测量覆盖率 不幸的是 Play 生成了一些垃圾类 IntelliJ 将它们包含在报告中 有没有办法排除覆盖率报告中的某些
  • 大 O 和等号,滥用符号

    维基百科说 http en wikipedia org wiki Big O notation Matters of notation 上面定义的语句 f x is O g x 通常写为 f x O g x 有些人认为这是对符号的滥用 因为
  • PHP:在多维数组中查找相同的键并合并结果

    我有一个多维数组 如下所示 array 0 gt array WS gt array id gt 2 name gt hello 1 gt array SS gt array id gt 1 name gt hello2 2 gt arra
  • 页面上首次调用 Url.Action 速度很慢

    我有一个相当简单的 ASP MVC 视图的性能问题 这是一个登录页面 应该几乎是即时的 但需要大约半秒钟 经过大量挖掘后 问题似乎出在第一个调用上Url Action 大约需要 450 毫秒 根据迷你分析器 http miniprofile
  • 我应该如何审核 MySQL 表中的更改(使用 MySQL 4)?

    我被要求审核 MySQL 表中的任何 所有更改 有谁知道有什么工具可以帮助我做到这一点 还是我需要编写自己的解决方案 如果我编写自己的审计 我最初的想法是制作一个单独的表并在 PHP 代码中构建一系列更改 类似 fieldname1 gt
  • 两个 RichTextBox 具有相同的滚动条

    是否有任何可用的第三方工具有两个富文本框 但两者只有一个共享滚动条 我需要用两种不同的语言实现一些文本 但两个文本框应该同时滚动 public enum ScrollBarType uint SbHorz 0 SbVert 1 SbCtl
  • 可视化 TFLite 图并获取特定节点的中间值?

    我想知道是否有办法知道 tflite 中特定节点的输入和输出列表 我知道我可以获得输入 输出详细信息 但这不允许我重建发生在Interpreter 所以我要做的是 interpreter tf lite Interpreter model