如何在C#环境中将训练完成的CNTK模型保存为ONNX格式
C#环境下CNTK导出ONNX格式模型实现指引
前置准备
- 项目需引用CNTK 2.7及以上版本的官方NuGet包,2.7以下版本的C# API未开放ONNX格式导出能力
- 提前备好通过
trainer.SaveCheckpoint方法存储的CNTK原生格式模型文件
核心实现逻辑
Python端的ONNX保存代码z.save("myModel.onnx", format=C.ModelFormat.ONNX),在C#端没有特殊的隔离实现,仅需先完成原生模型的加载,再调用对应Save方法即可:
- 加载已训练的原生模型为推理可用的Function对象
using CNTK; // 根据实际运行环境选择CPU/GPU设备,此处示例为CPU DeviceDescriptor device = DeviceDescriptor.CPUDevice; // 加载CNTK原生格式模型,需关闭性能模型加载以保留推理权重 Function trainedModel = Function.Load( modelFile: "你的原生模型文件路径.model", device: device, modelLoadFormat: ModelFormat.CNTKNativeFormat, loadPerformanceModel: false ); - 执行ONNX格式导出
trainedModel.Save("myModel.onnx", ModelFormat.ONNX);
常见踩坑说明
- 不可直接对Trainer实例调用Save方法,所有ONNX导出操作必须基于独立的
Function类型模型对象执行 - 若导出的ONNX模型与CNTK原生模型推理结果存在偏差,优先检查
Function.Load的loadPerformanceModel参数:该参数默认值为true,加载的是训练阶段的优化器状态,会丢失推理必需的网络权重,必须显式设置为false - 若编译器无法识别
ModelFormat.ONNX枚举,需检查当前引用的CNTK包版本,部分早期2.7版本的枚举命名有细微调整,对照CNTK命名空间下的ModelFormat枚举定义匹配即可
内容的提问来源于stack exchange,提问作者Mario
相关产品推荐
相关产品推荐

