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

发布时间:2026/9/9 12:28:43

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/9/9 12:23:43

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

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

2026/9/9 12:23:43

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

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

2026/9/9 16:29:51

屏幕标记工具全解析:从掌控演示注意到ZoomIt与Epic Pen实操指南

开篇先聊一个挺常见的场景:你在线上会议里讲一个方案,屏幕上的页面信息特别密集,客户问“你说的这个数在哪儿”,你得在几十行表格里找半天,鼠标指针转了好几圈对方还是没跟上。又或者线下投影时,现场灯光一…

2026/9/9 16:29:51

Python多线程:从GIL原理到IO密集任务的高效处理

在 Python 生态里聊多线程,几乎每次都会被人拿 GIL 怼一遍。这话没毛病,CPU 密集任务拿多线程去跑,确实可能越跑越慢;但如果你是写爬虫、报表生成、批量接口调用、文件处理这类脚本,多线程在大部分情况下就是性价比最高…

2026/9/9 16:29:51

碎片时间读小说:从工具优化到自控,一套合理摸鱼方法论

工作日午休时间,大家吃完饭回到工位,有人刷短视频,有人趴在桌上补觉,还有一部分人盯着手机屏幕,页面停在XX阅读或XX小说的正文界面。那些年我练出来的一个本事是:能在开会前的两分钟里,把上一章…

2026/9/9 13:11:35

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/8 7:15:15

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/9 16:31:09

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/9 0:00:48

MHS模型硬件标准:让大模型像调用软件一样控制物理设备

让Claude真正看着显微镜说“这个细胞形态不太对”,或者让大模型自己调一版机械臂的运动轨迹,这事儿听上去已经很接近科幻片了。但你真上手试一次就会发现,模型不缺智商,缺的是一个能插进显微镜、机械臂、激光控制器里的“通用插座…

2026/9/9 0:00:48

AI五大核心方向详解:从机器学习到大模型,零基础转行选哪条?

会有人告诉我,他想转行学AI,但打开招聘网站一看直接傻眼:机器学习、深度学习、自然语言处理、计算机视觉、大模型应用……满屏都是这些词,好像每个都会一点,又好像每个都离自己很远。还有人上来就问“学Python还是学Ja…

2026/9/9 0:00:49

从50行最小循环到生产级AI引擎:工程化改造全解析

直接说干货。这一章我写的不是那种"hello world跑通某个模型"的教程,而是把AI引擎当做一个真正要上线、要被人调用、要扛流量的系统来聊。从最初只有50行的最小循环,到能够承载生产流量的AI引擎,中间差的不是代码量,而是…

2026/9/7 16:23:03

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/7 22:46:00

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/9 10:21:54

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

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

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

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