tensorflow的滑動平均

import tensorflow as tfimport matplotlib.pyplot as plt%matplotlib inline

滑動平均模型能夠讓模型模型不被更新得太快,進而在測試集上更健壯。在統計學中,移動平均通過建立整個數據集中的一系列子集的平均值來分析數據點的計算方法。

計算流圖:

g = tf.Graph()# +1操作的數據流圖with g.as_default(): with tf.name_scope("MovingAverage"): count = tf.Variable(0, dtype=tf.float32, name="count") one = tf.constant(1.0, dtype=tf.float32, name="1") add1 = tf.add(count, one, name="count") # 記錄日誌 tf.summary.scalar("count", count) # +1操作 add1_op = tf.assign(count, add1) ema = tf.train.ExponentialMovingAverage(0.99) ema_op = ema.apply([count]) moving_averaged_count = ema.average(count) tf.summary.scalar("moving_averaged_count", moving_averaged_count) with tf.name_scope("global_ops"): merged = tf.summary.merge_all() initializer = tf.global_variables_initializer()

訓練:

summary_writer = tf.summary.FileWriter(logdir="./log/ema", graph=g)with tf.Session(graph=g) as sess: sess.run(initializer) variables = [] shadow_variables = [] for i in range(100): # 得到變數值和滑動平均的變數值(ema.average來獲得) (variable, shadow_variable) = sess.run([count, moving_averaged_count]) merged_summary_ = sess.run(merged) print(variable, shadow_variable) variables.append(variable) shadow_variables.append(shadow_variable) # 更新變數本身的操作 sess.run(add1_op) # 更新變數的滑動平均值的操作 sess.run(ema_op) summary_writer.add_summary(merged_summary_, global_step=i)

原始數據與滑動平均後的數據對照:

在實際的學習演算法中,訓練操作(train_op)執行後,再執行更新滑動平均操作(ema_op)。train_op和ema_op都是對參數的更新,但ema_op不會直接更新參數變數,而是通過ema.average函數返回一個張量,這個張量就是滑動平均後的參數值。實際應用的過程中,在前向傳播的計算流圖中用這個張量替代原來的參數變數即可。

推薦閱讀:

pytorch實現capsule
谷歌今日上線基於TensorFlow的機器學習速成課程(免費中文版)
樣本極不均衡情況下的無效擬合問題
機器學習與數據挖掘網上資源
邏輯回歸(二分類)與極大似然

TAG:TensorFlow | 機器學習 |