欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談Tensorflow模型的保存與恢復(fù)加載

 更新時間:2018年04月26日 10:21:04   作者:lyyyyy  
本篇文章主要介紹了淺談Tensorflow模型的保存與恢復(fù)加載,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

近期做了一些反垃圾的工作,除了使用常用的規(guī)則匹配過濾等手段,也采用了一些機器學(xué)習(xí)方法進行分類預(yù)測。我們使用TensorFlow進行模型的訓(xùn)練,訓(xùn)練好的模型需要保存,預(yù)測階段我們需要將模型進行加載還原使用,這就涉及TensorFlow模型的保存與恢復(fù)加載。

總結(jié)一下Tensorflow常用的模型保存方式。

保存checkpoint模型文件(.ckpt)

首先,TensorFlow提供了一個非常方便的api,tf.train.Saver()來保存和還原一個機器學(xué)習(xí)模型。

模型保存

使用tf.train.Saver()來保存模型文件非常方便,下面是一個簡單的例子:

import tensorflow as tf
import os

def save_model_ckpt(ckpt_file_path):
  x = tf.placeholder(tf.int32, name='x')
  y = tf.placeholder(tf.int32, name='y')
  b = tf.Variable(1, name='b')
  xy = tf.multiply(x, y)
  op = tf.add(xy, b, name='op_to_store')

  sess = tf.Session()
  sess.run(tf.global_variables_initializer())

  path = os.path.dirname(os.path.abspath(ckpt_file_path))
  if os.path.isdir(path) is False:
    os.makedirs(path)

  tf.train.Saver().save(sess, ckpt_file_path)
  
  # test
  feed_dict = {x: 2, y: 3}
  print(sess.run(op, feed_dict))

程序生成并保存四個文件(在版本0.11之前只會生成三個文件:checkpoint, model.ckpt, model.ckpt.meta)

  1. checkpoint 文本文件,記錄了模型文件的路徑信息列表
  2. model.ckpt.data-00000-of-00001 網(wǎng)絡(luò)權(quán)重信息
  3. model.ckpt.index .data和.index這兩個文件是二進制文件,保存了模型中的變量參數(shù)(權(quán)重)信息
  4. model.ckpt.meta 二進制文件,保存了模型的計算圖結(jié)構(gòu)信息(模型的網(wǎng)絡(luò)結(jié)構(gòu))protobuf

以上是tf.train.Saver().save()的基本用法,save()方法還有很多可配置的參數(shù):

tf.train.Saver().save(sess, ckpt_file_path, global_step=1000)

加上global_step參數(shù)代表在每1000次迭代后保存模型,會在模型文件后加上"-1000",model.ckpt-1000.index, model.ckpt-1000.meta, model.ckpt.data-1000-00000-of-00001

每1000次迭代保存一次模型,但是模型的結(jié)構(gòu)信息文件不會變,就只用1000次迭代時保存一下,不用相應(yīng)的每1000次保存一次,所以當我們不需要保存meta文件時,可以加上write_meta_graph=False參數(shù),如下:

復(fù)制代碼 代碼如下:
tf.train.Saver().save(sess, ckpt_file_path, global_step=1000, write_meta_graph=False)

如果想每兩小時保存一次模型,并且只保存最新的4個模型,可以加上使用max_to_keep(默認值為5,如果想每訓(xùn)練一個epoch就保存一次,可以將其設(shè)置為None或0,但是沒啥用不推薦), keep_checkpoint_every_n_hours參數(shù),如下:

復(fù)制代碼 代碼如下:
tf.train.Saver().save(sess, ckpt_file_path, max_to_keep=4, keep_checkpoint_every_n_hours=2)

同時在tf.train.Saver()類中,如果我們不指定任何信息,則會保存所有的參數(shù)信息,我們也可以指定部分想要保存的內(nèi)容,例如只保存x, y參數(shù)(可傳入?yún)?shù)list或dict):

tf.train.Saver([x, y]).save(sess, ckpt_file_path)

ps. 在模型訓(xùn)練過程中需要在保存后拿到的變量或參數(shù)名屬性name不能丟,不然模型還原后不能通過get_tensor_by_name()獲取。

模型加載還原

針對上面的模型保存例子,還原模型的過程如下:

import tensorflow as tf

def restore_model_ckpt(ckpt_file_path):
  sess = tf.Session()
  saver = tf.train.import_meta_graph('./ckpt/model.ckpt.meta') # 加載模型結(jié)構(gòu)
  saver.restore(sess, tf.train.latest_checkpoint('./ckpt')) # 只需要指定目錄就可以恢復(fù)所有變量信息

  # 直接獲取保存的變量
  print(sess.run('b:0'))

  # 獲取placeholder變量
  input_x = sess.graph.get_tensor_by_name('x:0')
  input_y = sess.graph.get_tensor_by_name('y:0')
  # 獲取需要進行計算的operator
  op = sess.graph.get_tensor_by_name('op_to_store:0')

  # 加入新的操作
  add_on_op = tf.multiply(op, 2)

  ret = sess.run(add_on_op, {input_x: 5, input_y: 5})
  print(ret)

首先還原模型結(jié)構(gòu),然后還原變量(參數(shù))信息,最后我們就可以獲得已訓(xùn)練的模型中的各種信息了(保存的變量、placeholder變量、operator等),同時可以對獲取的變量添加各種新的操作(見以上代碼注釋)。
并且,我們也可以加載部分模型,在此基礎(chǔ)上加入其它操作,具體可以參考官方文檔和demo。

針對ckpt模型文件的保存與還原,stackoverflow上有一個回答解釋比較清晰,可以參考。

同時cv-tricks.com上面的TensorFlow模型保存與恢復(fù)的教程也非常好,可以參考。

《tensorflow 1.0 學(xué)習(xí):模型的保存與恢復(fù)(Saver)》有一些Saver使用技巧。

保存單個模型文件(.pb)

我自己運行過Tensorflow的inception-v3的demo,發(fā)現(xiàn)運行結(jié)束后會生成一個.pb的模型文件,這個文件是作為后續(xù)預(yù)測或遷移學(xué)習(xí)使用的,就一個文件,非常炫酷,也十分方便。

這個過程的主要思路是graph_def文件中沒有包含網(wǎng)絡(luò)中的Variable值(通常情況存儲了權(quán)重),但是卻包含了constant值,所以如果我們能把Variable轉(zhuǎn)換為constant(使用graph_util.convert_variables_to_constants()函數(shù)),即可達到使用一個文件同時存儲網(wǎng)絡(luò)架構(gòu)與權(quán)重的目標。

ps:這里.pb是模型文件的后綴名,當然我們也可以用其它的后綴(使用.pb與google保持一致 ╮(╯▽╰)╭)

模型保存

同樣根據(jù)上面的例子,一個簡單的demo:

import tensorflow as tf
import os
from tensorflow.python.framework import graph_util

def save_mode_pb(pb_file_path):
  x = tf.placeholder(tf.int32, name='x')
  y = tf.placeholder(tf.int32, name='y')
  b = tf.Variable(1, name='b')
  xy = tf.multiply(x, y)
  # 這里的輸出需要加上name屬性
  op = tf.add(xy, b, name='op_to_store')

  sess = tf.Session()
  sess.run(tf.global_variables_initializer())

  path = os.path.dirname(os.path.abspath(pb_file_path))
  if os.path.isdir(path) is False:
    os.makedirs(path)

  # convert_variables_to_constants 需要指定output_node_names,list(),可以多個
  constant_graph = graph_util.convert_variables_to_constants(sess, sess.graph_def, ['op_to_store'])
  with tf.gfile.FastGFile(pb_file_path, mode='wb') as f:
    f.write(constant_graph.SerializeToString())

  # test
  feed_dict = {x: 2, y: 3}
  print(sess.run(op, feed_dict))

程序生成并保存一個文件

model.pb 二進制文件,同時保存了模型網(wǎng)絡(luò)結(jié)構(gòu)和參數(shù)(權(quán)重)信息

模型加載還原

針對上面的模型保存例子,還原模型的過程如下:

import tensorflow as tf
from tensorflow.python.platform import gfile

def restore_mode_pb(pb_file_path):
  sess = tf.Session()
  with gfile.FastGFile(pb_file_path, 'rb') as f:
    graph_def = tf.GraphDef()
    graph_def.ParseFromString(f.read())
    sess.graph.as_default()
    tf.import_graph_def(graph_def, name='')

  print(sess.run('b:0'))

  input_x = sess.graph.get_tensor_by_name('x:0')
  input_y = sess.graph.get_tensor_by_name('y:0')

  op = sess.graph.get_tensor_by_name('op_to_store:0')

  ret = sess.run(op, {input_x: 5, input_y: 5})
  print(ret)

模型的還原過程與checkpoint差不多一樣。

將TensorFlow的網(wǎng)絡(luò)導(dǎo)出為單個文件》上介紹了TensorFlow保存單個模型文件的方式,大同小異,可以看看。

思考

模型的保存與加載只是TensorFlow中最基礎(chǔ)的部分之一,雖然簡單但是也必不可少,在實際運用中還需要注意模型何時保存,哪些變量需要保存,如何設(shè)計加載實現(xiàn)遷移學(xué)習(xí)等等問題。

同時TensorFlow的函數(shù)和類都在一直變化更新,以后也有可能出現(xiàn)更豐富的模型保存和還原的方法。

選擇保存為checkpoint或單個pb文件視業(yè)務(wù)情況而定,沒有特別大的差別。checkpoint保存感覺會更加靈活一些,pb文件更適合線上部署吧(個人看法)。

以上完整代碼:github https://github.com/liuyan731/tf_demo

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 淺談一下python中threading模塊

    淺談一下python中threading模塊

    這篇文章主要介紹了一下python中threading模塊,threading提供了一個比thread模塊更高層的API來提供線程的并發(fā)性。這些線程并發(fā)運行并共享內(nèi)存,需要的朋友可以參考下
    2023-04-04
  • python實現(xiàn)猜數(shù)游戲

    python實現(xiàn)猜數(shù)游戲

    這篇文章主要為大家詳細介紹了python實現(xiàn)猜數(shù)游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • 如何在ubuntu中切換使用不同版本的python

    如何在ubuntu中切換使用不同版本的python

    在ubuntu環(huán)境下進行嵌入式開發(fā),我們在進行不同的項目開發(fā)時,可能會遇到python環(huán)境不統(tǒng)一的情況,下面這篇文章主要給大家介紹了關(guān)于如何在ubuntu中切換使用不同版本的python的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • 教你用Python爬取英雄聯(lián)盟皮膚原畫

    教你用Python爬取英雄聯(lián)盟皮膚原畫

    今天給大家?guī)淼氖顷P(guān)于Python的相關(guān)知識,文章圍繞著用Python爬取英雄聯(lián)盟皮膚原畫展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • 淺談flask截獲所有訪問及before/after_request修飾器

    淺談flask截獲所有訪問及before/after_request修飾器

    這篇文章主要介紹了淺談flask截獲所有訪問及before/after_request修飾器,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • Python中單線程、多線程和多進程的效率對比實驗實例

    Python中單線程、多線程和多進程的效率對比實驗實例

    這篇文章主要介紹了Python單線程多線程和多進程效率對比,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • Python深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)殘差塊

    Python深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)殘差塊

    這篇文章主要為大家介紹了Python深度學(xué)習(xí)中的神經(jīng)網(wǎng)絡(luò)殘差塊示例詳解有需要的 朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2021-10-10
  • Python?xlwt工具使用詳解,生成excel欄位寬度可自適應(yīng)內(nèi)容長度

    Python?xlwt工具使用詳解,生成excel欄位寬度可自適應(yīng)內(nèi)容長度

    這篇文章主要介紹了Python?xlwt工具使用詳解,生成excel欄位寬度可自適應(yīng)內(nèi)容長度,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • python在windows下創(chuàng)建隱藏窗口子進程的方法

    python在windows下創(chuàng)建隱藏窗口子進程的方法

    這篇文章主要介紹了python在windows下創(chuàng)建隱藏窗口子進程的方法,涉及Python使用subprocess模塊操作進程的相關(guān)技巧,需要的朋友可以參考下
    2015-06-06
  • python的debug實用工具 pdb詳解

    python的debug實用工具 pdb詳解

    這篇文章主要介紹了python的debug實用工具 pdb詳解,首先,介紹一下 pdb 調(diào)試,pdb 是 python 的一個內(nèi)置模塊,用于命令行來調(diào)試 Python 代碼,需要的朋友可以參考下
    2019-07-07

最新評論