tensorflow中moving average的用法

通常在保存模型參數的時候,都會保存一份moving average,是取了不一樣迭代次數模型的移動平均,移動平均後的模型每每在性能上會比最後一次迭代保存的模型要好一些。html

tensorflow-models項目中tutorials下cifar中相關的代碼寫的有點問題,在這寫下我本身的作法:git

 

1.構建訓練模型時,添加以下代碼github

1 variable_averages = tf.train.ExponentialMovingAverage(0.999, global_step) 2 variables_averages_op = variable_averages.apply(tf.trainable_variables()) 3 ave_vars = [variable_averages.average(var) for var in tf.trainable_variables()] 4 train_op = tf.group(train_op, variables_averages_op)

第1行建立了一個指數移動平均類 variable_averagessession

第2行將variable_averages做用於當前模型中全部可訓練的變量上,獲得 variables_averages_op操做符app

第3行得到全部可訓練變量對應的移動平均變量列表集合,後續用於保存模型性能

第4行在原有的訓練操做符基礎上,再添加variables_averages_op操做符,後續session執行run的時候,除了訓練時前向後向,梯度更新,還會對相應的變量作移動平均測試

 

2.開始訓練前,建立saver時,使用以下代碼spa

1 save_vars = tf.trainable_variables() + ave_vars
2 saver = tf.train.Saver(var_list=save_vars, max_to_keep=5)

第1行獲取全部須要保存的變量列表,這個時候 ave_vars就派上用場了。rest

第2行建立saver,指定var_list爲全部可訓練變量及其對應的移動平均變量。code

另外須要注意的是,若是你的模型中有bn或者相似層,包含有統計參數(均值、方差等),這些不屬於可訓練參數,還須要額外添加進save_vars中,能夠參考個人這篇博客

 

3.在作inference的時候,利用以下代碼從checkpoint中恢復出移動平均模型

1 variable_averages = tf.train.ExponentialMovingAverage(0.999) 2 variables_to_restore = variable_averages.variables_to_restore() 3 saver = tf.train.Saver(variables_to_restore) 4 saver.restore(sess, model_path)

這幾行很簡單,就不作解釋了。

實際上,在inference的時候,剛剛的作法除了能夠從checkpoint文件中恢復出移動平均參數,還能夠恢復出對應迭代的模型參數,能夠用來對比兩種方式,哪一種效果更好,這時只須要將上面代碼的第3行改成saver = tf.train.Saver(tf.trainable_variables())便可(和保存時相同,若是有bn,也須要額外考慮)。在個人測試中,使用移動平均參數效果更佳。

相關文章
相關標籤/搜索