访问内部张量并向tflite模型添加新节点?

时间:2018-11-01 15:58:18

标签: python tensorflow tensorflow-lite

我是TensorFlow和TensorFlow Lite的新手。我遵循了有关如何使用toco将模型量化并将模型转换为定点计算的教程。现在,我有一个tflite文件,该文件应该仅执行定点操作。我有两个问题

  1. 如何在python中对此进行测试?如何访问tflite文件中的所有操作和结果?
  2. 是否可以在此tflite文件中添加新节点或操作?如果可以,怎么办?

如果有人可以指导我,我将非常感激。

感谢和问候,
阿比纳夫·乔治

1 个答案:

答案 0 :(得分:1)

  

是否可以在此tflite文件中添加新节点或操作?如果可以,怎么办?

不幸的是,,这实际上是一件好事。 TF-Lite的设计轻巧高效,它使用映射文件,平面缓冲区,静态执行计划等来减少内存占用。这样做的代价是您失去了TensorFlow的任何灵活性。

TF-Lite是用于部署的框架。但是,在Google IO的早期,TF团队提到了进行设备上培训的可能性,因此将来可能会提供某种灵活性,但现在不是。


  

如何在python中对此进行测试?如何访问tflite文件中的所有操作和结果?

无法访问所有内部操作,只能输入和输出。原因很简单:内部张量不会被保存,因为它们的内存部分也用于其他操作(这就是为什么它的内存占用量如此之小)的原因。

如果只想查看输出,可以使用以下Python API(代码不言自明):

import pprint
from tensorflow.contrib.lite.python import interpreter as interpreter_wrapper

# Load the model and allocate the static memory plan
interpreter = interpreter_wrapper.Interpreter(model_path='model.tflite')
interpreter.allocate_tensors()

# print out the input details
input_details = interpreter.get_input_details()
print('input_details:')
pp = pprint.PrettyPrinter(indent=2)
pp.pprint(input_details)

# print out the output details
output_details = interpreter.get_output_details()
print('output_details:')
pp = pprint.PrettyPrinter(indent=2)
pp.pprint(output_details)

# set input (img is a `numpy array`)
interpreter.set_tensor(input_details[0]['index'], img)

# forward pass
interpreter.invoke()

# get output of the network
output = interpreter.get_tensor(output_details[0]['index'])

  

如果我为非输入和非输出张量调用interpreter.get_tensor怎么办?

执行相应的操作后,您将不会获得该张量中包含的实际数据。如前所述,张量的存储部分与其他张量共享,以实现最大效率。