Tensorflow模型保存與加載

   在使用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

      •  sess:在tensorflow中,變量是存在於Session環境中,即只有在Session環境下才會存有變量值,所以,保存模型時須要傳入session
      • global_step:在n次迭代後,再保存模型,只需設置global_step參數便可
      • 因爲圖是不變的,不必每次都去保存,能夠在屢次迭代過程當中只用保存一次模型便可,能夠經過設置write_meta_graph=False便可
      • keep_checkpoint_every_n_hours:用來設置間隔時間來保存
      • max_to_keep: 用來設置保存最近模型文件的個數
      • 若是不想保存全部變量,而只保存一部分變量,能夠經過指定variables/collections,默認是保存全部的變量。

    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)
相關文章
相關標籤/搜索