当前位置:首页 > 文章列表 > 科技周边 > 人工智能 > ONNX Runtime 怎样查看模型输入名称与形状

ONNX Runtime 怎样查看模型输入名称与形状

来源:17golang原创 2026-10-26 21:55:24 0浏览 收藏

ONNX Runtime 里不要靠猜测模型输入名来构造 feeds。加载模型后,直接遍历 InferenceSession.get_inputs(),就能拿到每个输入的 NodeArg 元数据:name 是输入键,type 是 ONNX 类型描述,shape 是静态或动态形状。读取这些信息后,再用同一个名称建立输入字典,能避开“输入名不存在”和“数组维度不匹配”两类常见问题。

官方文档:https://onnxruntime.ai/docs/api/python/api_summary.html

最小做法是先创建 InferenceSession,再遍历 session.get_inputs();每个 NodeArg 的 name、type、shape 就是构造输入映射前应确认的契约。

先把模型输入契约读出来

InferenceSession 是 ONNX Runtime 加载和运行模型的主要对象。本文只关注元数据查询,不讨论执行提供者、GPU 绑定或性能调优。下面的代码只负责读取模型描述,适合放在接入新模型时的准备阶段。

import onnxruntime as ort

# 只加载模型并读取会话信息,不在这里执行推理。
session = ort.InferenceSession("model.onnx")

# 输入节点按模型中的定义返回,每一项都是 NodeArg。
for node in session.get_inputs():
    print(node.name, node.type, node.shape)

关键点是 get_inputs() 返回一个输入元数据列表,而不是已经准备好的数组。列表中的每个元素对应模型图的一个输入节点,因此它适合先用于生成接入层的配置或调试日志。

ONNX Runtime 会话、输入 NodeArg 元数据和模型输入契约的静态关系图
图1:结构图展示 InferenceSession、get_inputs()、NodeArg 与 name/type/shape 元数据之间的静态关系,不是运行截图。

逐项读取 name、type 和 shape

NodeArg 里最常用的三个属性分别解决不同问题:

  • name:构造输入字典时使用的键,必须与模型输入名称一致。
  • type:模型声明的 ONNX 类型,例如 tensor(float),用于检查输入数据类型方向。
  • shape:张量各维度的描述,可能是整数,也可能包含 None 或字符串形式的动态维度。

为了让结果更容易复制到日志或配置中,可以把元数据整理成普通字典。这里不把动态维度强行转成整数,因为它们代表模型允许在运行时决定的尺寸。

def collect_input_metadata(session):
    """收集输入元数据,保留动态维度的原始表达。"""
    metadata = []
    for node in session.get_inputs():
        # name 用来做 feeds 的键,type 和 shape 用来做输入契约提示。
        metadata.append({
            "name": node.name,
            "type": node.type,
            "shape": list(node.shape),
        })
    return metadata


for item in collect_input_metadata(session):
    print(item)

这段代码的输出只描述模型接口,不代表模型已经成功推理。若要保存到配置文件,建议保留原始的维度值,以便后续区分固定批大小和动态批大小。

动态维度不要当成固定数字

常见的动态形状会把批大小、序列长度或图像尺寸写成 None、batch、height 之类的占位信息。读取时可以把“是否动态”单独标记出来,而不是使用一个固定样例形状覆盖所有情况。

def describe_shape(shape):
    """为每个维度保留值,并标出需要运行时决定的维度。"""
    dimensions = []
    for index, value in enumerate(shape):
        # 整数表示静态尺寸,其他值只作为动态维度的提示。
        is_dynamic = not isinstance(value, int)
        dimensions.append({
            "index": index,
            "value": value,
            "dynamic": is_dynamic,
        })
    return dimensions


for node in session.get_inputs():
    print(node.name, describe_shape(node.shape))

如果后续业务只允许某个批大小或某个分辨率,应在业务层明确限制并给出错误提示;不能把模型元数据中的动态维度误读成“任意形状都可以”。类型、维度数量和具体元素数量仍然要与模型算子约束相容。

ONNX Runtime 输入名称、数据类型、静态或动态形状与 feeds 映射的静态关系图
图2:结构图把输入名称、类型、形状和 feeds 映射放在同一契约边界中,突出动态维度需要由运行时输入确定,不是执行证据。

按读取到的名称构造输入映射

真正准备输入数组时,最容易犯的错是把自己熟悉的 input 当成键名。正确做法是使用 get_inputs() 读出的 name,再把数组放入字典。示例保留了一个固定形状,实际尺寸应以你读到的元数据和模型约定为准。

import numpy as np

input_nodes = session.get_inputs()
if len(input_nodes) != 1:
    raise ValueError("示例只处理单输入模型,请先按名称分别准备多个输入")

input_node = input_nodes[0]

# 这里的形状只是示例,接入真实模型时应根据输入契约准备数据。
features = np.zeros((1, 3), dtype=np.float32)
feeds = {input_node.name: features}

# 需要执行推理时,再把 feeds 传给 session.run;本文不依赖运行结果。
print("feed key:", input_node.name)
print("feed shape:", features.shape)

如果模型有多个输入,就分别遍历节点并按名称建立映射。若数组的 dtype 与 node.type 不一致,或者数组形状与固定维度不一致,应在提交给运行时前主动报错,这比等到执行阶段看到笼统异常更容易定位。

输出元数据也可以一起确认

输入检查完成后,可以用同样方式读取 session.get_outputs()。这一步不需要运行模型,适合在服务启动时打印接口摘要,确认输出名称和后续解析逻辑一致。

def print_io_metadata(session):
    """同时打印输入和输出的接口元数据。"""
    for label, nodes in (("input", session.get_inputs()), ("output", session.get_outputs())):
        for node in nodes:
            # NodeArg 的三个属性足够构成一条简洁的 IO 契约。
            print(label, node.name, node.type, node.shape)


print_io_metadata(session)

可以把这份摘要写入应用日志或启动检查结果,但不要把日志里的示例值当作所有模型都适用的固定答案。模型换版后,输入数量、节点名称和动态维度都可能发生变化。

常见问题

为什么 feeds 的键名不能随便写?

因为键名对应模型图中的输入节点名称。应以 session.get_inputs() 返回的 name 为准,而不是依据文件名或业务字段名猜测。

shape 中出现字符串是不是读取失败?

不一定。字符串通常是动态维度的符号名称,表示该维度需要由实际输入决定。固定维度仍要按原值匹配,动态维度则要结合模型和业务约束处理。

只看输入元数据就能保证推理成功吗?

不能。它能确认输入名称、类型和形状契约,但数据内容、算子支持、运行设备和模型本身的完整性仍需由实际接入流程负责。

小结

ONNX Runtime 查看模型输入名称与形状的核心只有三步:创建 InferenceSession,遍历 get_inputs(),读取每个 NodeArg 的 name、type 和 shape。先把这份输入契约读清楚,再按真实名称构造 feeds,遇到多输入模型或动态维度时就能把问题拆成可定位的字段,而不是反复试错。

版本声明
本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
GitHub CLI 怎样为当前仓库切换默认远程GitHub CLI 怎样为当前仓库切换默认远程
上一篇
GitHub CLI 怎样为当前仓库切换默认远程
OpenAI API 怎样限制输出内容使用指定文本格式
下一篇
OpenAI API 怎样限制输出内容使用指定文本格式
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • PubMedQA数据集详解:生物医学问答基准、功能与应用指南
    PubMedQA
    深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
    719次使用
  • H2O EvalGPT:开源LLM大模型评估与排行榜工具
    H2O EvalGPT
    H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
    726次使用
  • LMArena是什么?伯克利AI模型评估平台使用指南与功能解析
    LMArena
    LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
    801次使用
  • 斯坦福HELM:大语言模型Holistic Evaluation整体评估框架详解
    HELM
    深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
    762次使用
  • MMBench详解:多模态大模型基准测试、功能特点与使用指南
    MMBench
    MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
    599次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议 和 隐私政策
返回登录
  • 重置密码