tensorflow saver 保存和恢復(fù)指定 tensor的實(shí)例講解
在實(shí)踐中經(jīng)常會(huì)遇到這樣的情況:
1、用簡單的模型預(yù)訓(xùn)練參數(shù)
2、把預(yù)訓(xùn)練的參數(shù)導(dǎo)入復(fù)雜的模型后訓(xùn)練復(fù)雜的模型
這時(shí)就產(chǎn)生一個(gè)問題:
如何加載預(yù)訓(xùn)練的參數(shù)。
下面就是我的總結(jié)。
為了方便說明,做一個(gè)假設(shè):簡單的模型只有一個(gè)卷基層,復(fù)雜模型有兩個(gè)。
卷積層的實(shí)現(xiàn)代碼如下:
import tensorflow as tf # PS:本篇的重?fù)?dān)是saver,不過為了方便閱讀還是說明下參數(shù) # 參數(shù) # name:創(chuàng)建卷基層的代碼這么多,必須要函數(shù)化,而為了防止變量沖突就需要用tf.name_scope # input_data:輸入數(shù)據(jù) # width, high:卷積小窗口的寬、高 # deep_before, deep_after:卷積前后的神經(jīng)元數(shù)量 # stride:卷積小窗口的移動(dòng)步長 def make_conv(name, input_data, width, high, deep_before,deep_after, stride, padding_type='SAME'): global parameters with tf.name_scope(name) asscope: weights =tf.Variable(tf.truncated_normal([width, high, deep_before, deep_after], dtype=tf.float32,stddev=0.01), trainable=True, name='weights') biases =tf.Variable(tf.constant(0.1, shape=[deep_after]), trainable=True, name='biases') conv =tf.nn.conv2d(input_data, weights, [1, stride, stride, 1], padding=padding_type) bias = tf.add(conv,biases) bias = batch_norm(bias,deep_after, 1) # batch_norm是自己寫的batchnorm函數(shù) conv =tf.maximum(0.1*bias, bias) return conv
簡單的預(yù)訓(xùn)練模型就下面一句話
conv1 =make_conv('simple-conv1', images, 3, 3, 3, 32, 1)
復(fù)雜的模型是兩個(gè)卷基層,如下:
conv1 = make_conv('complex-conv1',images, 3, 3, 3, 32, 1) pool1= make_max_pool('layer1-pool1', conv1, 2, 2) conv2= make_conv('complex-conv2', pool1, 3, 3, 32, 64, 1)
這時(shí)簡簡單單的在預(yù)訓(xùn)練模型中:
saver = tf.train.Saver() with tf.Session() as sess: saver.save(sess,'model.ckpt')
就不行了,因?yàn)椋?/p>
1,如果你在預(yù)訓(xùn)練模型中使用下面的話打印所有tensor
all_v =tf.global_variables() for i in all_v: print i
會(huì)發(fā)現(xiàn)tensor的名字不是weights和biases,而是'simple-conv1/weights和'simple-conv1/biases,如下:
<tf.Variable'simple-conv1/weights:0' shape=(3, 3, 3, 32) dtype=float32_ref> <tf.Variable'simple-conv1/biases:0' shape=(32,) dtype=float32_ref> <tf.Variable 'simple-conv1/Variable:0' shape=(32,)dtype=float32_ref> <tf.Variable 'simple-conv1/Variable_1:0' shape=(32,)dtype=float32_ref> <tf.Variable 'simple-conv1/Variable_2:0' shape=(32,)dtype=float32_ref> <tf.Variable 'simple-conv1/Variable_3:0' shape=(32,)dtype=float32_ref>
同理,在復(fù)雜模型中就是complex-conv1/weights和complex-conv1/biases,這是對不上號的。
2,預(yù)訓(xùn)練模型中只有1個(gè)卷積層,而復(fù)雜模型中有兩個(gè),而tensorflow默認(rèn)會(huì)從模型文件('model.ckpt')中找所有的“可訓(xùn)練的”tensor,找不到會(huì)報(bào)錯(cuò)。
解決方法:
1,在預(yù)訓(xùn)練模型中定義全局變量
parm_dict={}
并在“return conv”上面添加下面兩行
parm_dict['complex-conv1/weights']= weights parm_dict['complex-conv1/']= biases
然后在定義saver時(shí)使用下面這句話:
saver= tf.train.Saver(parm_dict)
這樣保存后的模型文件就對應(yīng)到復(fù)雜模型上了。
2,在復(fù)雜模型中定義全局變量
parameters= []
并在“return conv”上面添加下面行
parameters+= [weights, biases]
然后判斷如果是第二個(gè)卷積層就不更新parameters。
接著在定義saver時(shí)使用下面這句話:
saver= tf.train.Saver(parameters)
這樣就可以告訴saver,只需要從模型文件中找weights和biases,而那些什么complex-conv1/Variable~ complex-conv1/Variable_3統(tǒng)統(tǒng)滾一邊去(上面紅色部分)。
最后使用下面的代碼加載就可以了
with tf.Session() as sess: ckpt= tf.train.get_checkpoint_state('.') if ckpt and ckpt.model_checkpoint_path: saver.restore(sess,ckpt.model_checkpoint_path) else: print ' no saver.' exit()
以上這篇tensorflow saver 保存和恢復(fù)指定 tensor的實(shí)例講解就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
基于python-opencv3實(shí)現(xiàn)圖像顯示和保存操作
這篇文章主要介紹了基于python opencv3的圖像顯示和保存操作方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-06-06Python gevent協(xié)程切換實(shí)現(xiàn)詳解
這篇文章主要介紹了Python gevent協(xié)程切換實(shí)現(xiàn)詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09Python中很常用的函數(shù)map()用法實(shí)例
這篇文章主要給大家介紹了關(guān)于Python中很常用的函數(shù)map()用法的相關(guān)資料,map()函數(shù)是Python的內(nèi)置函數(shù),會(huì)根據(jù)提供的函數(shù)參數(shù),對傳入的序列數(shù)據(jù)進(jìn)行映射,需要的朋友可以參考下2023-10-10pandas.DataFrame的pivot()和unstack()實(shí)現(xiàn)行轉(zhuǎn)列
這篇文章主要介紹了pandas.DataFrame的pivot()和unstack()實(shí)現(xiàn)行轉(zhuǎn)列,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-07-07python?flask框架中多種查詢參數(shù)的獲取方式
這篇文章主要介紹了pythonflask框架的生命周期以及多種查詢參數(shù)的獲取方式,文章通過代碼示例和圖文講解的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-03-03基于Python的ModbusTCP客戶端實(shí)現(xiàn)詳解
這篇文章主要介紹了基于Python的ModbusTCP客戶端實(shí)現(xiàn)詳解,Modbus Poll和Modbus Slave是兩款非常流行的Modbus設(shè)備仿真軟件,支持Modbus RTU/ASCII和Modbus TCP/IP協(xié)議 ,經(jīng)常用于測試和調(diào)試Modbus設(shè)備,觀察Modbus通信過程中的各種報(bào)文,需要的朋友可以參考下2019-07-07Python3批量創(chuàng)建Crowd用戶并分配組
這篇文章主要介紹了Python3批量創(chuàng)建Crowd用戶并分配組,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05Python如何獲取免費(fèi)高匿代理IP及驗(yàn)證
這篇文章主要介紹了Python如何獲取免費(fèi)高匿代理IP及驗(yàn)證問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06Python自動(dòng)發(fā)送郵件的方法實(shí)例總結(jié)
這篇文章主要介紹了Python自動(dòng)發(fā)送郵件的方法,結(jié)合實(shí)例形式總結(jié)分析了Python使用smtplib和email模塊發(fā)送郵件的相關(guān)使用技巧與操作注意事項(xiàng),需要的朋友可以參考下2018-12-12