通常,训练一个具有一定实用价值的深度神经网络是非常消耗计算时间的。所以在使用时,最好的方法是导入已经训练好的模型,重用它,而不是每次都重新训练。
如果要在TensorFlow中保存已经训练好的神经网络模型,所需的核心方法就是Saver.save,它位于Saver类中:
将训练好的模型参数保存起来,以便以后进行验证或测试,这是我们经常要做的事情。模型保存,先要创建一个Saver对象,如:
saver=tf.train.Saver()
在创建这个Saver对象的时候,有一个参数我们经常会用到,就是 max_to_keep 参数,这个是用来设置保存模型的个数,默认为5,即 max_to_keep=5,保存最近的5个模型。如果你想每训练一代(epoch)就想保存一次模型,则可以将 max_to_keep设置为None或者0,如:
saver=tf.train.Saver(max_to_keep=0)
但是这样做除了多占用硬盘,并没有实际多大的用处,因此不推荐。
当然,如果你只想保存最后一代的模型,则只需要将max_to_keep设置为1即可,即
saver=tf.train.Saver(max_to_keep=1)
创建完saver对象后,就可以保存训练好的模型了,如:
saver.save(sess,'folder_for_nn/save_net.ckpt',global_step=step)
第一个参数sess,这个就不用说了。第二个参数设定保存的路径和名字,第三个参数将训练的次数作为后缀加入到模型名字中。
saver.save(sess, 'my-model', global_step=0) ==> filename: 'my-model-0'
...
saver.save(sess, 'my-model', global_step=1000) ==> filename: 'my-model-1000'
来看一段简单的示例代码:
import tensorflow as tf
import numpy as np
## Save to file
# remember to define the same dtype and shape when restore
W = tf.Variable([[2,5,7],[11,13,19]], dtype=tf.float32, name='weights')
b = tf.Variable([[23,29,31]], dtype=tf.float32, name='biases')
# initialization
init = tf.global_variables_initializer()
saver = tf.train.Saver()
特别地,需要指明你想要存储的位置:
with tf.Session() as sess:
sess.run(init)
save_path = saver.save(sess, "folder_for_nn/save_net.ckpt")
print("Save to path: ", save_path)
假设我们的程序文件和你要保存模型参数文件的文件夹在同一个路径下,如下图所示(你可以事先建好这个文件夹,或者让TF来自动创建它,至少在我的实验中发现TF可以自行创建这个路径 ):
import tensorflow as tf
import numpy as np
# 先建立 W, b 的容器
W = tf.Variable(np.arange(6).reshape((2, 3)), dtype=tf.float32, name="weights")
b = tf.Variable(np.arange(3).reshape((1, 3)), dtype=tf.float32, name="biases")
#Notice: init = tf.global_variables_initializer() is unnecessary
saver = tf.train.Saver()
with tf.Session() as sess:
# 提取变量
saver.restore(sess,tf.train.latest_checkpoint('folder_for_nn'))
print("weights:", sess.run(W))
print("biases:", sess.run(b))
参考文献及推荐阅读材料:
http://www.cnblogs.com/denny402/p/6940134.html
(本文完)