InvalidGraphDef或ParseError: truncated message表明pb文件二进制内容不完整或被截断,常见于下载中断、传输未校验、Git误提交或文本编辑器误保存;需先用file命令确认格式,比对文件大小与sha256值,优先重下原始文件。

加载pb文件时报InvalidGraphDef或ParseError: truncated message
这是典型的pb文件结构损坏信号,不是模型权重出错,而是二进制协议缓冲区(protobuf)内容不完整或被意外截断。常见于文件下载中断、scp传输未校验、Git误提交(尤其是未配置.gitattributes导致二进制文件被换行符污染)、或用文本编辑器强行打开保存过。
- 先用
file model.pb确认是否真为protobuf格式——正常应输出data或protobuf;若显示UTF-8 Unicode text,说明已被转成文本,不可恢复 - 用
ls -l model.pb比对文件大小和原始发布页/源仓库的sha256值,小几十字节就极可能损坏 - 不要尝试用
tf.io.gfile.GFile读取后手动parseFromString——TensorFlow底层已做校验,绕过只会触发更深层的段错误
tf.compat.v1.GraphDef解析失败但文件大小正确
有些pb文件是SavedModel导出时用tf.saved_model.save生成的纯图结构(无变量),而你用tf.compat.v1.parse_graph_def加载——这要求pb必须是GraphDef序列化格式,而非MetaGraphDef或SavedModel目录结构。
- 用
saved_model_cli show --dir /path/to/saved_model --all先确认模型类型;若输出含MetaGraphDef with tag-set: 'serve',就不能直接load pb - 如果是单个pb文件,用
tf.io.read_file('model.pb')读取后传给tf.compat.v1.GraphDef().ParseFromString(...),再用tf.import_graph_def导入——注意ParseFromString会抛DecodeError,需捕获 - TensorFlow 2.x默认禁用v1兼容模式,需显式加
tf.compat.v1.disable_v2_behavior(),否则import_graph_def会静默失败
从ONNX或PyTorch转来的pb文件无法加载
这类pb往往由第三方工具(如onnx-tf、torch.onnx.export + tf2onnx)生成,但中间环节缺失op映射或shape推导,导致GraphDef中存在TensorFlow不识别的node.op(如NonMaxSuppressionV5在旧TF版本不存在)。
- 用
netron(桌面App或netron --port=8080 model.pb)打开pb,检查是否有红色节点或unknown op - 降级转换工具版本:例如
onnx-tf==1.9.1对应TF 2.8,而onnx-tf==1.10.0开始要求TF 2.12+,混用必报Op type not registered - 避免用
tf.keras.models.load_model加载非Keras保存的pb——它只认tf.keras.saving路径下的结构,其他一律报ValueError: No model found in config file
Windows下路径含中文或空格导致NotFoundError: Unsuccessful TensorSliceReader constructor
这个错误看似是文件找不到,实则是TensorFlow C++层在解析pb路径时,对宽字符或空格转义失败,进而跳过文件校验直接报错。Linux/macOS下较少见,但Windows上高频发生。
立即学习“Python免费学习笔记(深入)”;
- 绝对路径中禁止出现中文、空格、括号;临时方案是用
os.path.abspath获取路径后,用path.replace(' ', '_').encode('ascii', 'ignore').decode()粗暴清洗 - 不要用
\双反斜杠拼接路径——tf.io.gfile.GFile(r'C:modelmodel.pb', 'rb')里的r''必须存在,否则m会被当转义符吃掉 - 若用
tf.saved_model.load加载SavedModel目录,确保目录名不含Unicode,且目录内variables/子目录真实存在(有些转换脚本会漏生成该目录)


















