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

TensorFlow报错ValueError: No variables to save(实际存在大量变量)

解决TensorFlow加载PB图后Saver报"No variables to save"的问题

我之前也踩过一模一样的坑!问题根源其实有两个:你的PB文件保存方式不完整,以及导入PB图后变量没被加入到Saver默认查找的集合里,一步步给你捋清楚解决办法:

一、先修正计算图的保存逻辑

你原来保存graph_def的代码有个隐形错误,而且单纯存PB文件的方式本身就有局限:

definition = tf.Session().graph_def  # 这里新建了一个空会话,拿到的图结构并没有关联你初始化过的变量

更关键的是:普通PB文件只保存计算图的结构,不会保存变量的元数据信息,后续加载时TensorFlow没法自动识别这些变量。推荐用TensorFlow官方的SavedModel格式,它会同时保存图结构和变量相关信息,后续加载也更省心。

修改后的保存代码:

# 替换原来的write_graph部分
from tensorflow.python.saved_model import tag_constants

# 创建SavedModelBuilder保存完整模型
saved_model_dir = os.path.join(outdir, "tictactoe_saved_model")
builder = tf.saved_model.builder.SavedModelBuilder(saved_model_dir)
# 添加元图和变量,指定TRAINING标签方便后续训练场景加载
builder.add_meta_graph_and_variables(
    sess,
    [tag_constants.TRAINING]
)
builder.save()

二、修改加载代码(用SavedModel方式,推荐)

用SavedModel加载后,变量会自动被注册到tf.global_variables()集合里,Saver就能正常找到它们:

# 替换原来的PB文件加载部分
saved_model_dir = "src/tictactoe/simple_model/tictactoe_saved_model"
sess = tf.InteractiveSession()
# 加载模型,指定之前保存时用的TRAINING标签
tf.saved_model.loader.load(sess, [tf.saved_model.tag_constants.TRAINING], saved_model_dir)

# 后续代码不用大改,直接获取训练操作
train = sess.graph.get_operation_by_name('train')
# 现在创建Saver就不会报错了
saver = tf.train.Saver()

如果坚持要用PB文件加载(不推荐)

如果不想改保存方式,那就在加载PB图后手动收集所有变量,传给Saver:

# 在创建saver之前添加这段代码
# 方式1:手动指定变量名(需要知道你的层变量名,比如dense层的kernel、bias)
variables = [
    sess.graph.get_tensor_by_name("dense/kernel:0"),
    sess.graph.get_tensor_by_name("dense/bias:0"),
    sess.graph.get_tensor_by_name("dense_1/kernel:0"),
    sess.graph.get_tensor_by_name("dense_1/bias:0")
]

# 方式2:自动遍历图中所有VariableV2类型的节点(更通用,适合复杂模型)
var_nodes = [node for node in sess.graph.as_graph_def().node if node.op == "VariableV2"]
variables = [sess.graph.get_tensor_by_name(node.name + ":0") for node in var_nodes]

# 用收集到的变量创建Saver
saver = tf.train.Saver(variables)

为什么会出现这个错误?

简单来说:tf.train.Saver()默认会从tf.global_variables()集合里查找要保存的变量,但用tf.import_graph_def导入PB图时,导入的变量不会自动加入这个集合——TensorFlow把它们视为外部导入的节点,不会主动注册到默认变量集合中。而SavedModel格式会自动处理变量的集合注册,所以是最省心的方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:49:34