转,原创详见: http://blog.csdn.net/sinat_29957455/article/details/78508793
variables_to_restore函数,是TensorFlow为滑动平均值提供。之前,也介绍过通过使用滑动平均值可以让神经网络模型更加的健壮。我们也知道,其实在TensorFlow中,变量的滑动平均值都是由影子变量所维护的,如果你想要获取变量的滑动平均值需要获取的是影子变量而不是变量本身。
1、滑动平均值模型文件的保存
- import tensorflow as tf
-
- if __name__ == "__main__":
- v = tf.Variable(0.,name="v")
-
- ema = tf.train.ExponentialMovingAverage(0.99)
-
- op = ema.apply([v])
-
- print(v.name)
-
-
- save = tf.train.Saver()
- sess = tf.Session()
-
- init = tf.initialize_all_variables()
- sess.run(init)
-
- sess.run(tf.assign(v,10))
-
- sess.run(op)
-
- save.save(sess,"./model.ckpt")
-
- print(sess.run([v,ema.average(v)]))
-
上面的代码,是如何来保存一个滑动平均值的模型文件,之前有介绍过滑动平均值和模型文件的保存,所以这里就不再重复了。
2、滑动平均值模型文件的读取
- v = tf.Variable(1.,name="v")
- saver = tf.train.Saver({"v/ExponentialMovingAverage":v})
- sess = tf.Session()
- saver.restore(sess,"./model.ckpt")
- print(sess.run(v))
对于模型文件的读取,在上一篇博客中有介绍过,这里特别需要注意的一个地方就是,在使用tf.train.Saver函数中,所传递的模型参数是{"v/ExponentialMovingAverage":v}而不是{"v":v},如果你使用的是后面的参数,那么你得到的结果将是10而不是0.09,那是因为后者获取的是变量本身而不是影子变量。是不是感觉使用这种方式来读取模型文件的时候,还需要输入一大串的变量名称。
3、variables_to_restore函数的使用
- v = tf.Variable(1.,name="v")
- ema = tf.train.ExponentialMovingAverage(0.99)
- print(ema.variables_to_restore())
- sess = tf.Session()
- saver = tf.train.Saver(ema.variables_to_restore())
- saver.restore(sess,"./model.ckpt")
- print(sess.run(v))
通过使用variables_to_restore函数,可以使在加载模型的时候将影子变量直接映射到变量的本身,所以我们在获取变量的滑动平均值的时候只需要获取到变量的本身值而不需要去获取影子变量。
________________________________________________________