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
相关产品推荐
相关产品推荐

