在使用Tensorflow時,咱們常常要將以訓練好的模型保存到本地或者使用別人已訓練好的模型,所以,做此筆記記錄下來。網絡
TensorFlow經過tf.train.Saver類實現神經網絡模型的保存和提取。tf.train.Saver對象saver的save方法將TensorFlow模型保存到指定路徑中,如:saver.save(sess, "/Model/model"), 執行完,在相應的目錄下將會有4個文件:session
meta:文件保存的是圖結構信息,meta文件是pb(protocol buffer)格式文件,包含變量、op、集合等。ide
ckpt保存每一個變量的取值,此處文件名的寫入方式會因不一樣參數的設置而不一樣。是二進制文件,保存了全部的weights、biases、gradients等變量。在tensorflow 0.11之 前,保存在.ckpt文件中。0.11後,經過兩個文件保存,如:.data-00000-of-00001和.index文件spa
checkpoint文件:checkpoint_dir目錄下還有checkpoint文件,該文件是個文本文件,裏面記錄了保存的最新的checkpoint文件以及其它checkpoint文件列表。在inference時,能夠經過修改這個文件,指定使用哪一個model。加載restore時的文件路徑名是以checkpoint文件中的「model_checkpoint_path」值決定的。rest
保存模型時,只會保存變量的值,placeholder裏面的值不會被保存。code
關於save()方法的參數記錄:orm
global_step
參數便可tf.train.Saver類也支持在保存和加載時給變量重命名,聲明Saver類對象的時候使用一個字典dict重命名變量便可,{"已保存的變量的名稱name": 重命名變量名}。對象
導入模型blog
加載圖:saver=tf.train.import_meta_graph(.meta文件)便可。
get
加載模型參數:aver.restore(sess, tf.train.latest_checkpoint('./checkpoint_dir'))
graph = tf.get_default_graph()
w1 = graph.get_tensor_by_name("w1:0")
w2 = graph.get_tensor_by_name("w2:0")
feed_dict = {w1: 13.0, w2: 17.0}
注意是tensor的name,既能夠指定變量名稱,也能夠指定操做名稱。
w1:0
其實,咱們也能夠只恢復圖的一部分,而且再加入其它的op用於fine-tuning。只需經過graph.get_tensor_by_name()
方法獲取須要的op,而且在此基礎上創建圖便可。例如:假設咱們想使用已經訓練好的VGG模型,而且要更改部分層,以下:
saver = tf.train.import_meta_graph('vgg.meta')
# 訪問圖
graph = tf.get_default_graph()
#訪問用於fine-tuning的output
fc7= graph.get_tensor_by_name('fc7:0')
#若是你想修改最後一層梯度,須要以下
fc7 = tf.stop_gradient(fc7) # It's an identity function
fc7_shape= fc7.get_shape().as_list()
new_outputs=2
weights = tf.Variable(tf.truncated_normal([fc7_shape[3], num_outputs], stddev=0.05))
biases = tf.Variable(tf.constant(0.05, shape=[num_outputs]))
output = tf.matmul(fc7, weights) + biases
pred = tf.nn.softmax(output)