TensorFlow Lite 如何使用 signature API 指定模型输入输出张量?

发布时间:2026/10/30 9:10:57

TensorFlow Lite 如何使用 signature API 指定模型输入输出张量? TensorFlow Lite 如何使用 signature API 指定模型输入输出张量【免费下载链接】tensorflowAn Open Source Machine Learning Framework for Everyone项目地址: https://gitcode.com/GitHub_Trending/te/tensorflow当你转换出的 TensorFlow Lite 模型有多个入口例如一个模型同时承担编码和解码两种任务或者输入输出张量有明确命名时用整数索引去指定输入/输出张量既脆弱又难读。TensorFlow Lite 的 signature API 就是解决这个问题通过签名中定义的张量名称喂入输入、按名称取回输出并用签名键signature key选择要执行哪个入口。本文给出从准备带签名的模型、转换、验证签名存在到用 Python / Java / C 按名执行推理的完整路径。适用前提均来自官方文档模型本身必须带有签名。签名可以在构建 SavedModel 或创建 concrete function 时指定通过from_saved_model转换器支持签名自 TensorFlow 2.5 起自 TensorFlow 2.7.0 起所有转换器 API包括from_keras_model、from_concrete_functions转换出的模型都带有签名当前提供 Java、C 和 Python 三种语言绑定iOS/Swift 尚不支持。Signature 由什么组成根据 Signatures in TensorFlow Lite 的定义一个签名由三部分构成Inputs签名内输入名到输入张量的映射Outputs签名内输出名到输出张量的映射Signature Key标识图中一个入口点entry point的名称。由此带来两个能力转换出的 TensorFlow Lite 模型遵循原 TensorFlow 模型签名来指定输入输出单个 TensorFlow Lite 模型可以支持多个入口点。文档中的示例模型就是一个双入口模型class Model(tf.Module): tf.function(input_signature[tf.TensorSpec(shape[None], dtypetf.float32)]) def encode(self, x): result tf.strings.as_string(x) return { encoded_result: result } tf.function(input_signature[tf.TensorSpec(shape[None], dtypetf.string)]) def decode(self, x): result tf.strings.to_number(x) return { decoded_result: result }从签名角度看这个模型有两个签名签名键输入输出encode{x}{encoded_result}decode{x}{decoded_result}也就是说后面所有按名访问张量的代码里x、encoded_result等名称都来自这里而不是自己起的名字。转换出带签名的模型从 SavedModel 转换主路径先把签名显式写入 SavedModel再交给TFLiteConverter。tf.saved_model.save的signatures参数就是指定签名键与对应 concrete function 的地方model Model() # Save the model SAVED_MODEL_PATH content/saved_models/coding tf.saved_model.save( model, SAVED_MODEL_PATH, signatures{ encode: model.encode.get_concrete_function(), decode: model.decode.get_concrete_function() }) # Convert the saved model using TFLiteConverter converter tf.lite.TFLiteConverter.from_saved_model(SAVED_MODEL_PATH) converter.target_spec.supported_ops [ tf.lite.OpsSet.TFLITE_BUILTINS, # enable TensorFlow Lite ops. tf.lite.OpsSet.SELECT_TF_OPS # enable TensorFlow ops. ] tflite_model converter.convert() # Print the signatures from the converted model interpreter tf.lite.Interpreter(model_contenttflite_model) signatures interpreter.get_signature_list() print(signatures)示例中模型包含tf.strings这类 TensorFlow 算子因此文档设置了converter.target_spec.supported_ops同时启用TFLITE_BUILTINS与SELECT_TF_OPS。你的模型若只含纯 TFLite 内置算子可以按自身情况调整。最后一步interpreter.get_signature_list()就是文档给出的验证方式在转换器把签名信息带入.tflite模型后用它打印出模型中实际存在的签名列表确认转换结果与预期一致。替代入口Keras 模型与 concrete functions如果输入不是 SavedModel文档提供了两个等价路径Keras 模型走from_keras_model转换器会自动使用默认签名keras_model tf.keras.Sequential( [ tf.keras.layers.Dense(2, input_dim4, activationrelu, namex), tf.keras.layers.Dense(1, activationrelu, nameoutput), ] ) converter tf.lite.TFLiteConverter.from_keras_model(keras_model) tflite_model converter.convert() interpreter tf.lite.Interpreter(model_contenttflite_model) signatures interpreter.get_signature_list() print(signatures)多个 concrete function 走from_concrete_functions把encode和decode两个入口一次性传入model Model() converter tf.lite.TFLiteConverter.from_concrete_functions( [model.encode.get_concrete_function(), model.decode.get_concrete_function()], model) converter.target_spec.supported_ops [ tf.lite.OpsSet.TFLITE_BUILTINS, # enable TensorFlow Lite ops. tf.lite.OpsSet.SELECT_TF_OPS # enable TensorFlow ops. ] tflite_model converter.convert() interpreter tf.lite.Interpreter(model_contenttflite_model) signatures interpreter.get_signature_list() print(signatures)用 signature API 按名指定输入输出张量转换完成后tf.lite.Interpreter提供两个与签名相关的方法get_signature_list()列出模型内的签名get_signature_runner(key)拿到某个入口的执行器。拿到 runner 后按参数名传输入、按字典名取输出全程不接触张量索引# Load the TFLite model in TFLite Interpreter interpreter tf.lite.Interpreter(model_contenttflite_model) # Print the signatures from the converted model signatures interpreter.get_signature_list() print(Signature:, signatures) # encode and decode are callable with input as arguments. encode interpreter.get_signature_runner(encode) decode interpreter.get_signature_runner(decode) # encoded and decoded are dictionaries with all outputs from the inference. input tf.constant([1, 2, 3], dtypetf.float32) print(Input:, input) encoded encode(xinput) print(Encoded result:, encoded) decoded decode(xencoded[encoded_result]) print(Decoded result:, decoded)注意两处按名访问的细节调用encode(xinput)时参数名x必须与签名中的输入名一致返回值是包含全部输出的字典所以decode的输入直接写作encoded[encoded_result]——这正是签名把上一个入口的输出名和下一个入口的输入名接起来的用法。如果模型里只定义了一个签名可以省略签名键get_signature_runner()会默认返回它有多个签名时必须传名称。文档在 inference.md 中给出了自定义签名名的示例保存时用signatures{my_signature: module.add.get_concrete_function()}运行端再按get_signature_runner(my_signature)取用。JavaAndroidJava 端通过Interpreter.runSignature(inputs, outputs, signatureName)执行三个参数分别是输入名到输入对象的 Map、输出名到输出数据的 Map、签名键模型只有一个签名时可省略。同一个Interpreter实例上分别跑两个入口try (Interpreter interpreter new Interpreter(file_of_tensorflowlite_model)) { // Run encoding signature. MapString, Object inputs new HashMap(); inputs.put(x, input); MapString, Object outputs new HashMap(); outputs.put(encoded_result, encoded_result); interpreter.runSignature(inputs, outputs, encode); // Run decoding signature. MapString, Object inputs new HashMap(); inputs.put(x, encoded_result); MapString, Object outputs new HashMap(); outputs.put(decoded_result, decoded_result); interpreter.runSignature(inputs, outputs, decode); }runSignature适用于自 TensorFlow 2.5 起转换的模型。inputs/outputsMap 中的键x、encoded_result等必须与签名中定义的输入输出名一致。CAndroid、iOS、LinuxC 端通过GetSignatureRunner(key)拿到每个入口独立的SignatureRunner之后ResizeInputTensor、input_tensor、output_tensor全部接受张量名称而非索引SignatureRunner* encode_runner interpreter-GetSignatureRunner(encode); encode_runner-ResizeInputTensor(x, {100}); encode_runner-AllocateTensors(); TfLiteTensor* input_tensor encode_runner-input_tensor(x); float* input GetTensorDatafloat(input_tensor); // Fill input. encode_runner-Invoke(); const TfLiteTensor* output_tensor encode_runner-output_tensor( encoded_result); float* output GetTensorDatafloat(output_tensor); // Access output.模型没有签名时怎么办signature API 的前提是模型带有签名。若你的模型没有定义 SignatureDefinference.md 给出的是索引式 API 这一条替代路径Python 中用allocate_tensors()get_input_details()/get_output_details()set_tensor(index, ...)invoke()get_tensor(index)Java 中用Interpreter.run()单输入单输出或runForMultipleInputsOutputs(inputs, map_of_indices_to_outputs)张量索引必须与转换时给 Converter 的顺序一致且getInputIndex(opName)/getOutputIndex(opName)在名称不是模型中的合法操作时会抛出IllegalArgumentException。这条路径不能指定多个入口这正是多入口模型应使用 signature API 的原因。已知限制与版本边界线程安全由于 TFLite 解释器不保证线程安全同一解释器上的多个 signature runner 不会并发执行iOS/Swift签名支持尚不可用版本2.5 起from_saved_model支持签名2.7 起实现多签名功能且所有转换器 API 都生成带签名的 TensorFlow Lite 模型。如果你的模型只有一个固定入口索引式 API 已经够用只有在多入口、或需要按名称对接上游输出与下游输入时才值得按上面的路径改用 signature API。完整代码可直接对照仓库中的 signatures.ipynb 与 inference.md。【免费下载链接】tensorflowAn Open Source Machine Learning Framework for Everyone项目地址: https://gitcode.com/GitHub_Trending/te/tensorflow创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/10/28 15:32:23

Auto-PU论文复现:自动正例无标签学习的PyTorch实现

复现一篇没有官方源码的论文,九成时间不是耗在模型结构上,而是耗在一堆论文里根本不会写的细节上。这次我选的题目是Applied Intelligence 2025上关于Auto-PU的工作,核心是给正例无标签学习(PU learning,Positive-Unla…

2026/10/28 18:27:39

SEO关键词排名优化最佳实践:从策略到落地全解析

最近刚帮一个老客户把他们网站的SEO关键词排名重新拉回首页,顺手整理了一批文档。正好看到这个项目标题——"什么是SEO关键词排名优化的最佳实践",我觉得可以好好聊一聊这个问题。SEO这行做了十多年,看过太多人把关键词排名优化理解…

2026/10/30 9:06:59

因子图与图优化:核心差异与应用场景解析

1. 因子图与图优化的本质差异解析 在机器人定位与建图(SLAM)、传感器融合等领域,我们经常听到"因子图"和"图优化"这两个术语。很多刚接触这个领域的朋友容易将两者混淆,甚至认为它们是同一种技术的不同名称。…

2026/10/30 9:06:59

TinyMCE集成CAD矢量图形转换技术方案

1. 项目背景与核心挑战 在芯片制造企业的技术文档协作场景中,设计图纸的共享与编辑是个高频刚需。我们经常遇到这样的场景:工程师在AutoCAD中完成版图设计后,需要将图纸片段插入到技术文档中进行讨论。传统做法是导出为PNG/JPG等位图格式&…

2026/10/30 9:06:59

GMT ASCII Vectors 格式解析与 OGR 读写避坑指南

1. 先把 .gmt 文件当成"文本 段"来看 只要还在跟 GMT(Generic Mapping Tools)那套脚本打交道, .gmt 这个后缀迟早会出现在你面前。我最近一次碰到它,是接手一个跑了七八年的出图流程:前处理那一段用 Pyth…

2026/10/30 9:06:59

CEGUI-0.7.4输入法集成实战:跨平台IME支持与候选框锚定

简介:本资源是针对CEGUI-0.7.4图形界面库的中文输入法功能定制化开发包,面向嵌入式GUI开发者、C跨平台界面工程师及需要在CEGUI中快速集成中文输入支持的技术人员。资源聚焦输入法核心逻辑,剔除完整SDK冗余内容,仅保留371个头文件…

2026/10/30 9:06:59

AutoDL显卡租赁全流程:选卡、镜像、环境配置与成本控制

显卡租赁这件事,说白了就是把别人机房里的 GPU 按小时切开租给你用,AutoDL 就是这么一个面向深度学习场景的算力租赁平台。我第一次用它是为了跑一个图像分割的模型,本地那张 6G 显存的卡连 batch size 调到 2 都爆显存,换成租一张…

2026/10/30 8:56:33

EMD+PSO_SVM混合模型在大坝变形预测中的应用

1. 项目概述 大坝变形预测是水利工程安全监测中的核心课题,传统方法常面临非线性、非平稳数据处理难题。本项目创新性地将经验模态分解(EMD)、粒子群优化(PSO)与支持向量机(SVM)相结合,构建了EMDPSO_SVM混合预测模型。通过Matlab实现完整算法流程&#x…

2026/10/29 17:05:52

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/29 17:06:02

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/29 17:06:13

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/30 0:00:46

NCP1342高频准谐振反激控制器:从设计约束到验收的完整方案

简介:NCP1342 高频准谐振反激控制器应用介绍译文文档,面向电源设计工程师、硬件研发人员及开关电源学习者,帮助读者跨越英文原版资料的语言门槛,系统理解这款高集成度 QR Flyback 控制器的设计要点。文档围绕芯片核心特性展开&…

2026/10/30 0:00:46

NCP1342准谐振反激电源设计:从选型到验收的全流程解析

简介:这份文档面向电源设计工程师与开关电源学习者,系统梳理NCP1342高频准谐振反激控制器的应用要点,帮助读者快速理解这款高集成度离线电源变换器控制芯片的工作机制与设计方法。内容涵盖芯片核心特性、引脚功能定义、电气特性参数表、最大额…

2026/10/30 0:00:46

Web系统自动登出机制设计与实现全解析

1. 系统自动登出机制的设计初衷在各类Web应用和后台管理系统中,自动登出功能早已成为标配。这个看似简单的功能背后,实际上涉及用户安全、资源管理和体验优化的多重考量。作为从业十多年的老开发,我见过太多因为登出逻辑设计不当导致的安全事…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑