tf.variable_scope()与tf.train.Saver()的区别及变量一致性验证问题
聊聊
tf.variable_scope()和tf.train.Saver()的区别,还有你的变量复用问题 首先得说,这俩根本不是一类东西,完全是各司其职的工具:
tf.variable_scope():说白了就是给变量“分组起名字”的工具,帮你把神经网络里的变量按模块归类,避免重名冲突,还能实现变量共享。比如你在'conv_layer'这个作用域里定义的权重,名字会自动变成'conv_layer/weights',之后设置reuse=True,就能直接用这个名字的变量,不用重新创建。它管的是变量的创建、复用和命名规则,是图结构层面的管理。tf.train.Saver():这是专门负责“存盘和读档”的工具,训练完的变量值(比如训练好的权重、偏置),它能帮你写到磁盘文件里,之后测试或者继续训练时,又能把这些值原封不动加载回对应的变量里。它不管变量怎么创建出来的,只关心变量的数值持久化和恢复,是数据层面的操作。
然后来说你的第二个问题:只要操作正确,训练保存的变量,测试恢复后绝对和训练时的数值一模一样,不会有差异,完全能保证v1和复用的变量值一致。
给你划几个关键的注意点:
- 变量命名必须完全对应:测试阶段的变量定义(包括
variable_scope的名字、设置)要和训练阶段完全一致。比如训练时在'my_net'作用域下创建了v1,测试时也要在同一个作用域下设置reuse=True来获取v1,这样变量的全名是一样的,Saver才能准确找到对应的变量去赋值。 - 别搞混初始化和恢复的顺序:测试阶段千万别先调用
tf.global_variables_initializer(),因为初始化会给变量赋初始值,之后再restore的话会覆盖,但如果先restore再初始化,那训练保存的值就被冲掉了!正确顺序是:先构建和训练一样的图,创建Saver,然后在会话里直接restore,不用初始化。 - Saver的使用要对应:训练时创建Saver保存的变量,测试时的Saver要能匹配这些变量(默认Saver会处理所有可训练变量,只要图结构一致就没问题)。
举个实际的小例子你就懂了:
训练时的代码片段:
import tensorflow as tf # 训练阶段创建变量 with tf.variable_scope('my_model'): v1 = tf.get_variable('v1', shape=[1], initializer=tf.constant_initializer(0.0)) # 模拟训练过程,把v1的值改成5 saver = tf.train.Saver() with tf.Session() as sess: sess.run(tf.global_variables_initializer()) sess.run(tf.assign(v1, 5.0)) saver.save(sess, './trained_model') # 保存变量
测试时的代码片段:
import tensorflow as tf # 测试阶段复用同一作用域的变量 with tf.variable_scope('my_model', reuse=True): v1 = tf.get_variable('v1') saver = tf.train.Saver() with tf.Session() as sess: saver.restore(sess, './trained_model') # 恢复变量 print(sess.run(v1)) # 这里会输出5.0,和训练结束时的数值完全一致
这么操作下来,你担心的变量值不一致的情况根本不会发生,完全能保证训练的成果在测试阶段复用。
内容的提问来源于stack exchange,提问作者MRM
相关产品推荐
相关产品推荐

