TensorFlow 滑動(dòng)平均的示例代碼
滑動(dòng)平均會(huì)為目標(biāo)變量維護(hù)一個(gè)影子變量,影子變量不影響原變量的更新維護(hù),但是在測(cè)試或者實(shí)際預(yù)測(cè)過(guò)程中(非訓(xùn)練時(shí)),使用影子變量代替原變量。
1、滑動(dòng)平均求解對(duì)象初始化
ema = tf.train.ExponentialMovingAverage(decay,num_updates)
參數(shù)decay
`shadow_variable = decay * shadow_variable + (1 - decay) * variable`
參數(shù)num_updates
`min(decay, (1 + num_updates) / (10 + num_updates))`
2、添加/更新變量
添加目標(biāo)變量,為之維護(hù)影子變量
注意維護(hù)不是自動(dòng)的,需要每輪訓(xùn)練中運(yùn)行此句,所以一般都會(huì)使用tf.control_dependencies使之和train_op綁定,以至于每次train_op都會(huì)更新影子變量
ema.apply([var0, var1])
3、獲取影子變量值
這一步不需要定義圖中,從影子變量集合中提取目標(biāo)值
sess.run(ema.average([var0, var1]))
4、保存&載入影子變量
我們知道,在TensorFlow中,變量的滑動(dòng)平均值都是由影子變量所維護(hù)的,如果你想要獲取變量的滑動(dòng)平均值需要獲取的是影子變量而不是變量本身。
保存影子變量
建立tf.train.ExponentialMovingAverage對(duì)象后,Saver正常保存就會(huì)存入影子變量,命名規(guī)則是"v/ExponentialMovingAverage"對(duì)應(yīng)變量”v“
import tensorflow as tf if __name__ == "__main__": v = tf.Variable(0.,name="v") #設(shè)置滑動(dòng)平均模型的系數(shù) ema = tf.train.ExponentialMovingAverage(0.99) #設(shè)置變量v使用滑動(dòng)平均模型,tf.all_variables()設(shè)置所有變量 op = ema.apply([v]) #獲取變量v的名字 print(v.name) #v:0 #創(chuàng)建一個(gè)保存模型的對(duì)象 save = tf.train.Saver() sess = tf.Session() #初始化所有變量 init = tf.initialize_all_variables() sess.run(init) #給變量v重新賦值 sess.run(tf.assign(v,10)) #應(yīng)用平均滑動(dòng)設(shè)置 sess.run(op) #保存模型文件 save.save(sess,"./model.ckpt") #輸出變量v之前的值和使用滑動(dòng)平均模型之后的值 print(sess.run([v,ema.average(v)])) #[10.0, 0.099999905]
載入影子變量并映射到變量
利用了Saver載入模型的變量名映射功能,實(shí)際上對(duì)所有的變量都可以如此操作『TensorFlow』模型載入方法匯總
v = tf.Variable(1.,name="v")
#定義模型對(duì)象
saver = tf.train.Saver({"v/ExponentialMovingAverage":v})
sess = tf.Session()
saver.restore(sess,"./model.ckpt")
print(sess.run(v))
#0.0999999
這里特別需要注意的一個(gè)地方就是,在使用tf.train.Saver函數(shù)中,所傳遞的模型參數(shù)是{"v/ExponentialMovingAverage":v}而不是{"v":v},如果你使用的是后面的參數(shù),那么你得到的結(jié)果將是10而不是0.09,那是因?yàn)楹笳攉@取的是變量本身而不是影子變量。
使用這種方式來(lái)讀取模型文件的時(shí)候,還需要輸入一大串的變量名稱。
variables_to_restore函數(shù)的使用
v = tf.Variable(1.,name="v")
#滑動(dòng)模型的參數(shù)的大小并不會(huì)影響v的值
ema = tf.train.ExponentialMovingAverage(0.99)
print(ema.variables_to_restore())
#{'v/ExponentialMovingAverage': <tf.Variable 'v:0' shape=() dtype=float32_ref>}
sess = tf.Session()
saver = tf.train.Saver(ema.variables_to_restore())
saver.restore(sess,"./model.ckpt")
print(sess.run(v))
#0.0999999
variables_to_restore會(huì)識(shí)別網(wǎng)絡(luò)中的變量,并自動(dòng)生成影子變量名。
通過(guò)使用variables_to_restore函數(shù),可以使在加載模型的時(shí)候?qū)⒂白幼兞恐苯佑成涞阶兞康谋旧恚晕覀冊(cè)讷@取變量的滑動(dòng)平均值的時(shí)候只需要獲取到變量的本身值而不需要去獲取影子變量。
5、官方文檔例子
官方文檔中將每次apply更新就會(huì)自動(dòng)訓(xùn)練一邊模型,實(shí)際上可以反過(guò)來(lái)兩者關(guān)系,《tf實(shí)戰(zhàn)google》P128中有示例
| Example usage when creating a training model: | | ```python | # Create variables. | var0 = tf.Variable(...) | var1 = tf.Variable(...) | # ... use the variables to build a training model... | ... | # Create an op that applies the optimizer. This is what we usually | # would use as a training op. | opt_op = opt.minimize(my_loss, [var0, var1]) | | # Create an ExponentialMovingAverage object | ema = tf.train.ExponentialMovingAverage(decay=0.9999) | | with tf.control_dependencies([opt_op]): | # Create the shadow variables, and add ops to maintain moving averages | # of var0 and var1. This also creates an op that will update the moving | # averages after each training step. This is what we will use in place | # of the usual training op. | training_op = ema.apply([var0, var1]) | | ...train the model by running training_op... | ```
6、batch_normal的例子
和上面不太一樣的是,batch_normal中不太容易綁定到train_op(位于函數(shù)體外面),則強(qiáng)行將兩個(gè)variable的輸出過(guò)程化為節(jié)點(diǎn),綁定給參數(shù)更新步驟
def batch_norm(x,beta,gamma,phase_train,scope='bn',decay=0.9,eps=1e-5):
with tf.variable_scope(scope):
# beta = tf.get_variable(name='beta', shape=[n_out], initializer=tf.constant_initializer(0.0), trainable=True)
# gamma = tf.get_variable(name='gamma', shape=[n_out],
# initializer=tf.random_normal_initializer(1.0, stddev), trainable=True)
batch_mean,batch_var = tf.nn.moments(x,[0,1,2],name='moments')
ema = tf.train.ExponentialMovingAverage(decay=decay)
def mean_var_with_update():
ema_apply_op = ema.apply([batch_mean,batch_var])
with tf.control_dependencies([ema_apply_op]):
return tf.identity(batch_mean),tf.identity(batch_var)
# identity之后會(huì)把Variable轉(zhuǎn)換為Tensor并入圖中,
# 否則由于Variable是獨(dú)立于Session的,不會(huì)被圖控制control_dependencies限制
mean,var = tf.cond(phase_train,
mean_var_with_update,
lambda: (ema.average(batch_mean),ema.average(batch_var)))
normed = tf.nn.batch_normalization(x, mean, var, beta, gamma, eps)
return normed
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
最新解決沒(méi)有NVSMI文件夾以及nvidia-smi‘?不是內(nèi)部或外部命令也不是可運(yùn)行的程序或批處理文件
這篇文章主要介紹了解決沒(méi)有NVSMI文件夾以及nvidia-smi‘?不是內(nèi)部或外部命令也不是可運(yùn)行的程序或批處理文件,本文通過(guò)兩種問(wèn)題分析給大家分享解決方法,需要的朋友可以參考下2023-01-01
淺談tensorflow中幾個(gè)隨機(jī)函數(shù)的用法
今天小編就為大家分享一篇淺談tensorflow中幾個(gè)隨機(jī)函數(shù)的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07
從列表或字典創(chuàng)建Pandas的DataFrame對(duì)象的方法
這篇文章主要介紹了從列表或字典創(chuàng)建Pandas的DataFrame對(duì)象的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
Pytorch卷積神經(jīng)網(wǎng)絡(luò)resent網(wǎng)絡(luò)實(shí)踐
這篇文章主要為大家介紹了Pytorch卷積神經(jīng)網(wǎng)絡(luò)resent網(wǎng)絡(luò)實(shí)踐,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
python調(diào)用百度語(yǔ)音識(shí)別實(shí)現(xiàn)大音頻文件語(yǔ)音識(shí)別功能
這篇文章主要為大家詳細(xì)介紹了python調(diào)用百度語(yǔ)音識(shí)別實(shí)現(xiàn)大音頻文件語(yǔ)音識(shí)別功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-08-08
Python開發(fā)文字版密室逃脫游戲的實(shí)例(含代碼)
密室逃脫游戲是一種頗受歡迎的解謎類游戲,玩家通常需要通過(guò)觀察、推理、合作等方式解決一系列難題,以逃脫困境,在這篇博文中,我們將使用Python開發(fā)一個(gè)文字版密室逃脫游戲,旨在通過(guò)簡(jiǎn)單的文本交互來(lái)呈現(xiàn)游戲的趣味性與挑戰(zhàn)性2025-04-04

