Tensorflow 模型的保存和加載

今天寫測試程序的時(shí)候發(fā)現(xiàn)預(yù)測結(jié)果錯(cuò)到離譜系奉,眼看又要哭暈在廁所的我,又仔細(xì)檢查了一遍訓(xùn)練程序惭嚣,發(fā)現(xiàn)是模型保存錯(cuò)了 -_-||| 遵湖,把saver放在了循環(huán)的外面,這就很尷尬了晚吞。延旧。。改完又可以給自己放個(gè)小長假槽地,讓程序自己慢慢重跑一次吧啦啦啦小魔仙全身變迁沫。。捌蚊。

一集畅、模型的保存

分兩步。

1.在計(jì)算圖之后(所有變量節(jié)點(diǎn)都創(chuàng)建好之后)缅糟,定義一個(gè) saver 對象挺智。
2.開啟 Session ,利用 saver 保存模型溺拱。

首先逃贝,在定義計(jì)算圖之后,開啟會話之前迫摔,定義一個(gè) saver 對象沐扳。

saver = tf.train.Saver()

Saver 類在初始化時(shí),有一些常用的參數(shù):

  • var_list 默認(rèn)為 None句占,即保存所有可保存的對象沪摄。
  • reshape為 True 時(shí),表示從一個(gè) checkpoint 中恢復(fù)參數(shù)時(shí)允許參數(shù)shape發(fā)生變化。(當(dāng)我們r(jià)eshape了一個(gè)變量又希望加載舊模型時(shí)杨拐,該操作就很有用祈餐。)
  • max_to_keep 自動(dòng)保存 max_to_keep 個(gè)模型,默認(rèn)值為 5哄陶。(也就是說帆阳,盡管程序每個(gè) step 保存一次模型,但實(shí)際上只會保存最近的5次屋吨。)
  • keep_checkpoint_every_n_hours 用于指定保留 Checkpoints 文件的時(shí)間蜒谤,默認(rèn)為 10000 小時(shí)。

然后至扰,在開啟 Session 會話后鳍徽,利用 saver 保存模型:

# 開啟會話
with tf.Session() as sess:
  sess.run(init)
  ***省略代碼***

  #保存模型
  # 注意:路徑最后一項(xiàng)是模型名字,加載時(shí)模型路徑應(yīng)該為‘save/model/’
  saver.save(sess,'save/model/model',global_step=step)
  • 第一個(gè)參數(shù) sess 是定義的會話敢课,記錄了這次訓(xùn)練中所有變量的值阶祭。
  • 第二個(gè)參數(shù)是模型保存的路徑和名字。
  • 第三個(gè)參數(shù)用于把訓(xùn)練時(shí)的迭代次數(shù)加入文件名直秆。

例如:

# 模型的文件名:my_model-1
saver.save(sess,'save/model',global_step=1)
# 模型的文件名:my_model-1000
saver.save(sess,'save/model',global_step=1000)

保存之前要記住濒募,saver自動(dòng)保存max_to_keep個(gè)模型(默認(rèn)為5個(gè)),多了也沒用圾结,會自動(dòng)忽略噠~

下面是幾種常用的使用情況:

使用1 每次迭代保存一個(gè)模型
for i in range(2000):
  batch_xs, batch_ys = mnist.train.next_batch(100)
  sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
  saver.save(sess, './model/model', global_step=i+1)
使用2 每100次迭代保存一個(gè)模型
# 一共迭代num_step次
for i in range(num_step):
  batch_xs, batch_ys = mnist.train.next_batch(100)
  sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
  if i%100 == 0:
    saver.save(sess, './model/model', global_step=i+1)
使用3 保存結(jié)果最好的模型
# 一共迭代num_step次
 max_acc = 0
for i in range(num_step):
  batch_xs, batch_ys = mnist.train.next_batch(100)
  val_loss,val_acc=sess.run([loss,acc], feed_dict={x: batch_xs, y_: batch_ys})
  sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
  if val_acc>max_acc:
    max_acc = val_acc
    saver.save(sess, './model/model', global_step=i+1)
使用4 保存結(jié)果最好的3個(gè)模型
saver = tf.train.Saver(max_to_keep=3)
***省略代碼***

# 一共迭代num_step次
 max_acc = 0
for i in range(num_step):
  batch_xs, batch_ys = mnist.train.next_batch(100)
  val_loss,val_acc=sess.run([loss,acc], feed_dict={x: batch_xs, y_: batch_ys})
  sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
  if val_acc>max_acc:
    max_acc = val_acc
    saver.save(sess, './model/model', global_step=i+1)

模型路徑下會出現(xiàn)4個(gè)文件:
checkpoint 保存目錄下所有模型的文件列表
.index / .data 保存模型所有參數(shù)
.meta 保存計(jì)算圖

'./model ' 路徑下所保存的模型
'./model ' 路徑下所保存的模型

二萨咳、模型的加載

模型恢復(fù)用的是restore(sess, save_path)函數(shù),它需要兩個(gè)參數(shù)疫稿,sess表示當(dāng)前會話培他,之前保存的結(jié)果將被加載入這個(gè)會話,save_path指的是保存的模型路徑遗座。如:

# 加載模型參數(shù)
saver.restore(sess, "model/model-xxxx")  # xxxx是指定的加載模型舀凛,注意這里不用加模型的后綴名

注意:這里只加載了模型的所有參數(shù),需要重新定義計(jì)算圖途蒋。如果不想重新定義計(jì)算圖猛遍,也可以直接加載持久化的計(jì)算圖:

# 加載計(jì)算圖
saver =tf.train.import_meta_graph("Model/model.ckpt.meta") 

若不指定加載模型,可以直接獲得訓(xùn)練過程中最后保存的模型号坡,以下兩種方法可以實(shí)現(xiàn)獲得最近一次保存的模型:
獲得最近一次保存的模型 方法一
我們可以使用tf.train.latest_checkpoint()函數(shù)來自動(dòng)獲取最后一次保存的模型懊烤。如:

model = tf.train.latest_checkpoint('model/')  # 保存模型所在的路徑
print(model)  
# ./model\model.ckpt-47557
saver.restore(sess,model)

獲得最近一次保存的模型 方法二
我們可以使用tf.train.get_checkpoint_state()函數(shù)來自動(dòng)獲取最后一次保存的模型。如:

ckpt = tf.train.get_checkpoint_state('./model')
print(ckpt)
# model_checkpoint_path: "./model\\model.ckpt-47557"
# all_model_checkpoint_paths: "./model\\model.ckpt-40992"
# all_model_checkpoint_paths: "./model\\model.ckpt-45218"
# all_model_checkpoint_paths: "./model\\model.ckpt-47557"
print(ckpt.model_checkpoint_path)
# './model\\model.ckpt-47557'
saver.restore(sess, ckpt.model_checkpoint_path)

Reference
Tensorflow模型的保存與恢復(fù)
tensorflow模型保存與加載
TensorFlow模型保存和提取方法

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末宽堆,一起剝皮案震驚了整個(gè)濱河市腌紧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌畜隶,老刑警劉巖壁肋,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件号胚,死亡現(xiàn)場離奇詭異,居然都是意外死亡浸遗,警方通過查閱死者的電腦和手機(jī)猫胁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來跛锌,“玉大人弃秆,你說我怎么就攤上這事∷杳保” “怎么了驾茴?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長氢卡。 經(jīng)常有香客問我,道長晨缴,這世上最難降的妖魔是什么译秦? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮击碗,結(jié)果婚禮上筑悴,老公的妹妹穿的比我還像新娘。我一直安慰自己稍途,他們只是感情好阁吝,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著械拍,像睡著了一般突勇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上坷虑,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天甲馋,我揣著相機(jī)與錄音,去河邊找鬼迄损。 笑死定躏,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的芹敌。 我是一名探鬼主播痊远,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼氏捞!你這毒婦竟也來了碧聪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤液茎,失蹤者是張志新(化名)和其女友劉穎矾削,沒想到半個(gè)月后壤玫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡哼凯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年欲间,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片断部。...
    茶點(diǎn)故事閱讀 39,932評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡猎贴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蝴光,到底是詐尸還是另有隱情她渴,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布蔑祟,位于F島的核電站趁耗,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏疆虚。R本人自食惡果不足惜苛败,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望径簿。 院中可真熱鬧罢屈,春花似錦、人聲如沸篇亭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽译蒂。三九已至曼月,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間柔昼,已是汗流浹背十嘿。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留岳锁,地道東北人绩衷。 一個(gè)月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像激率,于是被迫代替她去往敵國和親咳燕。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評論 2 354