gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 12:28:15 28 4
gpt4 key购买 nike

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

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: this answer was written for Tensorflow 1.x and, while the concept and core idea remains the same in TensorFlow 2.x, the commands in this answer might be deprecated.

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

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

TensorFlow Lite 模型可以使用 visualize.py 进行可视化TensorFlow Lite repository 中的脚本。您只需要:

  • Clone the TensorFlow repository

  • 使用 bazel 运行 visualize.py 脚本:

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

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

不!事实上,TF-Lite 可以修改您的图表,使其变得更加优化。以下是 TF-Lite documentation 中关于它的一些文字。 :

A number of TensorFlow operations can be processed by TensorFlow Lite even though they have no direct equivalent. This is the case for operations that can be simply removed from the graph (tf.identity), replaced by tensors (tf.placeholder), or fused into more complex operations (tf.nn.bias_add). Even some supported operations may sometimes be removed through one of these processes.

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

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

不!在这里,我将解释原因 get_tensor(...)在 TF-Lite 中不起作用。假设在内部表示中,图包含 3 个张量,以及中间的一些密集操作(节点)(您可以将 tensor1 视为输入,将 tensor3 视为输出您的模型)。在此特定图的推理过程中,TF-Lite 需要 2 个缓冲区,让我们展示一下如何实现。

首先,使用tensor1通过应用dense运算来计算tensor2。这仅需要 2 个缓冲区来存储值:

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

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

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

现在是棘手的部分。 tensor1 的“输出值”仍指向 bufferA,它现在保存 tensor3 的值。因此,如果您调用 get_tensor(...)对于第一个张量,您将得到不正确的值。 documentation of this method甚至指出:

This function cannot be used to read intermediate results.

如何解决这个问题?

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

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

关于python - 可视化 TFLite 图并获取特定节点的中间值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56885007/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com