You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

运行TensorFlow label_image示例触发访问冲突问题求助

解决TensorFlow加载冻结PB文件时Session创建报错的问题

Hey,我之前也踩过几乎一模一样的坑!看起来ReadBinaryProto返回ok但graph_def实际是空的,Session创建时爆空指针错误,这问题大概率出在加载环节的隐性错误上,不是Session本身的锅。给你几个具体的排查和解决方向:

  • 先把文件路径的坑堵死
    你说路径已经确认,但有时候Windows下的路径斜杠、相对路径的工作目录很容易搞出问题。试试用绝对路径,把路径里的反斜杠换成双反斜杠(比如"C:\\models\\inception_v3_2016_08_28_frozen.pb")或者正斜杠("C:/models/inception_v3_2016_08_28_frozen.pb")。另外,强烈建议加个文件存在性检查,避免ReadBinaryProto悄悄失败却返回ok的情况:

    std::string pb_path = "你的绝对路径";
    std::ifstream pb_file(pb_path, std::ios::binary);
    if (!pb_file.good()) {
        std::cerr << "Error: PB文件不存在或者无法打开!" << std::endl;
        return nullptr;
    }
    
  • 确认ReadBinaryProto的真实执行状态
    有时候ReadBinaryProto的返回值会有误导,哪怕ok()返回true,也建议打印它的详细信息,同时检查graph_def的内容:

    tensorflow::GraphDef graph_def;
    tensorflow::Status load_status = ReadBinaryProto(tensorflow::Env::Default(), pb_path, &graph_def);
    
    if (!load_status.ok()) {
        std::cerr << "加载失败:" << load_status.ToString() << std::endl;
        return nullptr;
    } else {
        // 额外检查graph_def是否真的有内容
        if (graph_def.node_size() == 0) {
            std::cerr << "Warning: graph_def是空的!ReadBinaryProto可能静默失败了" << std::endl;
            return nullptr;
        }
        std::cout << "成功加载" << graph_def.node_size() << "个计算节点" << std::endl;
    }
    

    如果这里node_size()是0,要么是PB文件损坏,要么是你用的TensorFlow版本和生成这个PB文件的版本不兼容(比如旧版TF生成的文件在新版TF里解析异常)。

  • 检查Session的初始化方式
    你报错里提到session->_Mypair._Myval2 was nullptr,这说明Session对象本身可能没被正确初始化。正确的Session创建方式应该是这样的:

    tensorflow::SessionOptions session_opts;
    std::unique_ptr<tensorflow::Session> session(tensorflow::NewSession(session_opts));
    
    if (!session) {
        std::cerr << "Failed to create TensorFlow Session!" << std::endl;
        return nullptr;
    }
    
    tensorflow::Status create_status = session->Create(graph_def);
    if (!create_status.ok()) {
        std::cerr << "Session创建失败:" << create_status.ToString() << std::endl;
        return nullptr;
    }
    

    要是你直接声明了tensorflow::Session* session;却没调用NewSession初始化,那必然会报空指针错误。

  • 验证PB文件本身的有效性
    最后可以用Python代码快速验证PB文件是否正常:

    import tensorflow as tf
    from tensorflow.core.framework import graph_pb2
    
    with open("inception_v3_2016_08_28_frozen.pb", "rb") as f:
        graph_def = graph_pb2.GraphDef()
        graph_def.ParseFromString(f.read())
        print(f"PB文件包含{len(graph_def.node)}个计算节点")
        if len(graph_def.node) == 0:
            print("PB文件损坏或者不是有效的GraphDef格式!")
    

    如果Python里也读不出节点,那就是文件本身的问题,重新下载或者重新生成冻结PB文件就好。

内容的提问来源于stack exchange,提问作者Chris Traina

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:51:10