0

0

C# 操作TensorFlow SavedModel C#如何加载和使用TensorFlow训练好的模型文件

畫卷琴夢

畫卷琴夢

发布时间:2026-03-03 08:10:01

|

709人浏览过

|

来源于php中文网

原创

tensorflow.net 当前(v2.14+)不支持直接加载 savedmodel,loadsavedmodel() 抛 notimplementedexception;正确做法是传入含 saved_model.pb 和 variables/ 的目录路径,并通过 python 查 signature 后按签名张量名调用。

c# 操作tensorflow savedmodel c#如何加载和使用tensorflow训练好的模型文件

TensorFlow.NET 加载 SavedModel 会直接报错“NotImplementedException”

因为 TensorFlow.NET 当前(v2.14+)对 SavedModel 的原生支持仍不完整,LoadSavedModel() 函数只是声明了,但底层没实现——调用就崩。这不是你模型导出有问题,是库本身卡在关键路径上。

实操建议:

  • 改用 TensorFlowSharp?不行,它已停止维护,且不支持 TF 2.x 的 SavedModel 格式
  • 真正可行的路只有一条:把 SavedModel 转成 .pb 冻结图(frozen graph),再用 TensorFlow.NETSession.LoadFromSavedModel() 替代方案——即 Session.LoadMetaGraph() + Session.Restore(),但这要求你有 .meta + .index + .data 三件套
  • 更稳的选择:用 Python 启一个轻量服务(比如 Flask + tf.keras.models.load_model()),C# 通过 HTTP 调用;或者用 ML.NET 做中间桥接(前提是模型结构能被 ML.NET 导入)

SavedModel 目录里一堆文件,C# 到底该读哪个路径?

别碰 variables/assets/ 单独路径——TensorFlow.NETLoadSavedModel() 期望的是整个目录的**父路径**,且该路径下必须包含 saved_model.pb(或 saved_model.pbtxt)和 variables/ 子目录。

常见错误现象:

  • 传入 "./mymodel/variables" → 报 Invalid argument: Expected model file at .../variables/saved_model.pb
  • 传入 "./mymodel/saved_model.pb"(文件路径)→ 报 DirectoryNotFoundException
  • 路径末尾带斜杠或不带斜杠,行为不一致;建议统一用 Path.GetFullPath() 规范化

正确写法示例:

MagicArena
MagicArena

字节跳动推出的视觉大模型对战平台

下载
string modelPath = Path.GetFullPath(@"..\models\my_tf2_model"); // 指向含 saved_model.pb 的目录
var session = Session.LoadFromSavedModel(modelPath); // 注意:此行目前会抛 NotImplementedException

输入输出张量名对不上,session.GetOutput() 返回空或 shape 不匹配

TF 2.x 的 SavedModel 默认用的是“signature def”,不是原始 tensor 名。C# 侧看不到 serving_default 这类 signature,直接按 "input:0" 硬写大概率失败。

必须先查签名:

  • 用 Python 快速确认:from tensorflow.saved_model import load; m = load("path"); list(m.signatures.keys()),通常返回 ['serving_default']
  • 再看输入输出:m.signatures['serving_default'].structured_input_signature
  • C# 中不能跳过这步——你得把 signature 里的 input_1:0output_1:0 这类名字抄下来,而不是猜
  • Session.Run() 时,feed dict 的 key 必须是 signature 中的 tensor name(含冒号),例如 "serving_default_input_1:0",不是 "input_1"

为什么不用 ML.NET 直接加载 SavedModel

ML.NETTensorFlowModelScorer 确实支持 SavedModel,但它只认 TF 1.x 风格的模型(即含 .meta 文件的 checkpoint),对 TF 2.x 的纯 SavedModel(只有 saved_model.pb + variables/)支持有限,容易在 LoadTensorFlowModel() 时抛 InvalidOperationException: Could not find SavedModel bundle

如果你的模型是 Keras 训练的,更现实的做法是:

  • 导出时加 signatures 参数,确保 signature 名明确、输入输出 tensor 名不含动态前缀
  • 在 C# 中放弃“全自动加载”,改用 TensorFlow.NET 手动构造 Graph + Session,并显式指定 placeholder 和 fetch node
  • 接受一个事实:C# 生态对 TF 2.x 模型的原生支持仍是补丁状态,绕不开 Python 辅助验证和转换

最常被忽略的一点:TF 版本锁死。C# 项目引用的 TensorFlow.NET 必须与训练环境的 TensorFlow 主版本一致(比如 TF 2.12 训练 → C# 必须用 TensorFlow.NET v2.12.x),否则 saved_model.pb 解析会静默失败,连错误都不报全。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python Flask框架
Python Flask框架

本专题专注于 Python 轻量级 Web 框架 Flask 的学习与实战,内容涵盖路由与视图、模板渲染、表单处理、数据库集成、用户认证以及RESTful API 开发。通过博客系统、任务管理工具与微服务接口等项目实战,帮助学员掌握 Flask 在快速构建小型到中型 Web 应用中的核心技能。

99

2025.08.25

Python Flask Web框架与API开发
Python Flask Web框架与API开发

本专题系统介绍 Python Flask Web框架的基础与进阶应用,包括Flask路由、请求与响应、模板渲染、表单处理、安全性加固、数据库集成(SQLAlchemy)、以及使用Flask构建 RESTful API 服务。通过多个实战项目,帮助学习者掌握使用 Flask 开发高效、可扩展的 Web 应用与 API。

78

2025.12.15

session失效的原因
session失效的原因

session失效的原因有会话超时、会话数量限制、会话完整性检查、服务器重启、浏览器或设备问题等等。详细介绍:1、会话超时:服务器为Session设置了一个默认的超时时间,当用户在一段时间内没有与服务器交互时,Session将自动失效;2、会话数量限制:服务器为每个用户的Session数量设置了一个限制,当用户创建的Session数量超过这个限制时,最新的会覆盖最早的等等。

333

2023.10.17

session失效解决方法
session失效解决方法

session失效通常是由于 session 的生存时间过期或者服务器关闭导致的。其解决办法:1、延长session的生存时间;2、使用持久化存储;3、使用cookie;4、异步更新session;5、使用会话管理中间件。

773

2023.10.18

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

97

2025.08.19

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

431

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

600

2023.08.10

点击input框没有光标怎么办
点击input框没有光标怎么办

点击input框没有光标的解决办法:1、确认输入框焦点;2、清除浏览器缓存;3、更新浏览器;4、使用JavaScript;5、检查硬件设备;6、检查输入框属性;7、调试JavaScript代码;8、检查页面其他元素;9、考虑浏览器兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

196

2023.11.24

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

48

2026.02.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 10.6万人学习

C 教程
C 教程

共75课时 | 5.1万人学习

C++教程
C++教程

共115课时 | 20.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号