代码之家  ›  专栏  ›  技术社区  ›  Dmitrii

tflite:get_tensor on non-output tensor给出随机值

  •  0
  • Dmitrii  · 技术社区  · 6 年前

    我在试着调试我的 tflite 模型,使用自定义操作。我发现了操作名之间的对应关系(在 *.pb *.tflite ),我正在进行逐层比较(以确保输出差异始终在范围内 1e-4


    方法1: 我使用 get_tensor

    from tensorflow.contrib.lite.python import interpreter
    
    # load the model
    model = interpreter.Interpreter(model_path='model.tflite')
    model.allocate_tensors()
    
    # get tensors
    for i in tensor_ids:
        tensor_output[i] = model.get_tensor(i)
    

    它显示出完全不充分的随机值(与TensorFlow模型的输出相比)。


    方法2: 转换 只到某一层,然后重复,基本上:

    1. *.铅 所以它只包含来自 input layer_1 .

    2. 转换为 tflite公司 (所以现在的输出是 第1层 )用TensorFlow检查TF-Lite的输出。

    3. 对重复步骤1-2 layer_2 layer_3 , ... outputs

    此方法需要更多的工作和执行,但它正确地显示了对于内置操作 pb 模型是相同的,只是开始在我的定制操作不同(在 方法1 输出立即从第一层开始发散)。


    问题: 为什么 获取张量 tensorflow 1.9

    PS:我知道TF-Lite的发布,但是我已经为我的项目手动编译了tensorflow1.9,现在很难更改版本控制。

    2 回复  |  直到 5 年前
        1
  •  3
  •   Chan Kha Vu    6 年前


    第一步: 首先,我们输入符号张量 I (括号内)。假设它的值存储在一个名为 buffer_1

         op1       op2       op3
    (I) ---->  A  ---->  B  ---->  O
    _________________________________
    ^^^        ^^^^^^^^^^^^       ^^^
    input      intermediate    output
    tensor     tensors         tensor
    

    第二步: op1 论符号张量 得到符号张量 A . 我们计算 缓冲器1 在一个名为 buffer_2

        [op1]      op2       op3
    (I) ----> (A) ---->  B  ---->  O
    

    现在,我们在计算 op2 论符号张量 A 得到符号张量 B 缓冲器2 并存储符号张量的值 在一个名为 buffer_3 ...

         op1      [op2]      op3
     I  ----> (A) ----> (B) ---->  O
    

    但是等等! 缓冲器3 如果我们现在有 缓冲器1 它是未使用的,它的值现在对于获取输出是无用的 O ? 所以,不是储存在 ,我们将实际将此操作的结果存储在 !

    toco get_tensor


    一种更简单的调试方法?

    你提到你在写一个定制的操作,所以我想你已经构建了 tflite bazel Interpreter::Invoke() 在文件中 tensorflow/lite/interpreter.cc . 一个丑陋的黑客,但它是有效的。

        2
  •  1
  •   dez    6 年前

    是的,中间张量可以被覆盖,除非指定为输出。

    我设法解决了这个问题,使所有操作在转换期间都在输出列表中。然后在运行时保存它们,并且可以正确读取值。

    参见:

    Obtaining quantized activations in tensorflow lite

        3
  •  1
  •   Matthijs Hollemans    5 年前

    我在想将TFLite文件转换为另一个框架时遇到了类似的问题,而不访问用于生成TFLite文件的原始TF图。因为转换的输出与TFLite模型的输出不同,所以我想看看中间层的输出。多亏了这个话题,我才明白 get_tensor() 不是一个可靠的方法。

    最简单的解决方案是在十六进制编辑器中编辑TFLite文件!

    get_tensor_details() . 它以little endian int32的形式存储在TFLite文件中的某个地方。对于张量175,TFLite值将包含值0xAF000000。

    我希望这条建议对某些人有用。:-)