使用onnx.utils.extract_model提取SqueezeNet子模型遇ValidationError报错求助
解决ONNX extract_model提取Squeezenet子模型的ValidationError问题
错误原因
你遇到的ValidationError: squeezenet0_conv0_weight in initializer but not in graph input,是因为onnx.utils.extract_model默认参数keep_initializers_as_inputs=True。这个参数会把原模型中所有initializer(比如卷积层的权重参数)强制转为子模型的输入节点,但这些权重原本是存在模型的initializer中,不属于原模型的graph输入,因此模型检查时触发了不匹配的错误。
修正后的代码
调用extract_model时显式设置keep_initializers_as_inputs=False,让工具保留原模型中的initializer作为子模型的内部参数,而非转为输入即可解决:
model_path = 'squeezenet.onnx' onnx_model = onnx.load(model_path) onnx.checker.check_model(onnx_model) input_path = model_path output_path = "path/to/save/the/extracted/model.onnx" # 替换为你的实际路径 input_names = ["data"] output_names = ["squeezenet0_conv10_fwd"] # 添加参数保留initializer为内部参数 onnx.utils.extract_model(input_path, output_path, input_names, output_names, keep_initializers_as_inputs=False)
补充说明
keep_initializers_as_inputs参数用于控制是否将原模型的initializer转换为子模型的输入。设为False时,工具会自动保留子模型用到的initializer,将其作为内部参数存储,这是子模型提取的常规需求。- 只有当你需要把某些权重作为子模型的动态输入时,才需要将该参数设为
True,同时把对应权重名称加入input_names列表。
内容的提问来源于stack exchange,提问作者andreadaou
相关产品推荐
相关产品推荐

