2 回答
TA贡献1777条经验 获得超3个赞
是的,您可以在 TF-Lite 中使用动态张量。之所以不能直接将形状设置为,[None, 128, None, 1]是因为这样以后可以轻松支持更多的语言。此外,它充分利用了静态内存分配方案。对于旨在用于具有低计算能力的小型设备的框架,这是一个明智的设计选择。以下是如何动态设置张量大小的步骤:
0. 冻结
看起来你正在从一个冻结的 GraphDef 转换,即一个*.pb文件。假设您的冻结模型具有输入 shape [None, 128, None, 1]。
1.转换步骤。
在此步骤中,将输入大小设置为您的模型可以接受的任何有效大小。例如:
tflite_convert \
--graph_def_file='model.pb' \
--output_file='model.tflite' \
--input_shapes=1,128,80,1 \ # <-- here, you set an
# arbitrary valid shape
--input_arrays='input' \
--output_arrays='Softmax'
2.推理步骤
诀窍是interpreter::resize_tensor_input(...)在推理过程中实时使用TF-Lite API的功能。我将提供它的python实现。Java 和 C++ 实现应该相同(因为它们具有相似的 API):
from tensorflow.contrib.lite.python import interpreter
# Load the *.tflite model and get input details
model = Interpreter(model_path='model.tflite')
input_details = model.get_input_details()
# Your network currently has an input shape (1, 128, 80 , 1),
# but suppose you need the input size to be (2, 128, 200, 1).
model.resize_tensor_input(
input_details[0]['index'], (2, 128, 200, 1))
model.allocate_tensors()
而已。您现在可以将该模型用于具有 shape 的图像(2, 128, 200, 1),只要您的网络架构允许这样的输入形状。请注意,model.allocate_tensors()每次进行此类重塑时都必须这样做,因此效率非常低。这是强烈建议,以避免在程序中使用此功能太多。
TA贡献1796条经验 获得超4个赞
上述答案不再适用于较新版本的 Tensorflow。应该在转换步骤中使用形状 None 而不是虚拟形状,然后使用interpreter.resizeInput() 来工作。见这里:https : //github.com/tensorflow/tensorflow/issues/41807
添加回答
举报