日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

神经网络优化(二) - 滑动平均

發(fā)布時(shí)間:2023/12/18 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 神经网络优化(二) - 滑动平均 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1 滑動(dòng)平均概述

滑動(dòng)平均(也稱為 影子值 ):記錄了每一個(gè)參數(shù)一段時(shí)間內(nèi)過(guò)往值的平均,增加了模型的泛化性。

滑動(dòng)平均通常針對(duì)所有參數(shù)進(jìn)行優(yōu)化:W 和 b,

簡(jiǎn)單地理解,滑動(dòng)平均像是給參數(shù)加了一個(gè)影子,參數(shù)變化,影子緩慢追隨。

滑動(dòng)平均的表示公式為

影子 = 衰減率 * 影子 + ( 1 - 衰減率 ) * 參數(shù)

滑動(dòng)平均值 = 衰減率 * 滑動(dòng)平均值 + ( 1 - 衰減率 )* 參數(shù)

備注

影子初值 = 參數(shù)初值

衰減率 = min{ MOVING_AVERAGE_DECAY, (1+輪數(shù)) / (10 + 輪數(shù) ) }

示例:

MOVING_AVERAGE_DECAY 為 0.99, 參數(shù) w1 為 0,輪數(shù) global_step 為 0,w1的滑動(dòng)平均值為 0 。

參數(shù)w1更新為 1 時(shí),則

w1的滑動(dòng)平均值 = min( 0.99, 1/10 ) * 0 + ( 1 - min( 0.99, 1/10 ) * 1 = 0.9

?假設(shè)輪數(shù) global_step 為 100 時(shí),參數(shù) w1 更新為 10 時(shí),則

w1滑動(dòng)平均值 = min(0.99, 101/110) * 0.9 + ( 1 - min( 0.99, 101/110) * 10 = 1.644

再次運(yùn)行

w1滑動(dòng)平均值 = min(0.99, 101/110) * 1.644 + ( 1 - min( 0.99, 101/110) * 10 = 2.328

再次運(yùn)行

w1滑動(dòng)平均值 = 2.956

?

2 滑動(dòng)平均在Tensorflow中的表示方式

第一步 實(shí)例化滑動(dòng)平均類ema

ema = tf.train.ExponentialMovingAverage(MOVING_AVERAGE_DECAY(滑動(dòng)平均衰減率),global_step(輪數(shù)計(jì)數(shù)器,表示當(dāng)前輪數(shù)) )

備注:

MOVING_AVERAGE_DECAY 滑動(dòng)平均衰減率是超參數(shù),一般設(shè)定的值比較大;

global_step - 輪數(shù)計(jì)數(shù)器,表示當(dāng)前輪數(shù),這個(gè)參數(shù)與其他計(jì)數(shù)器公用。

第二步 求算滑動(dòng)平均節(jié)點(diǎn)ema_op

ema_op = ema.apply([])

ema.apply([ ]) 函數(shù)表示對(duì) [ ] 中的所有數(shù)值求滑動(dòng)平均。

示例:

ema_op = ema.apply(tf.trainable_variables())

每當(dāng)運(yùn)行此代碼時(shí),會(huì)對(duì)所以待優(yōu)化參數(shù)進(jìn)行求滑動(dòng)平均運(yùn)算。

第三步 具體實(shí)現(xiàn)方式

在工程應(yīng)用中,我們通常會(huì)將計(jì)算滑動(dòng)平均 ema_op 和訓(xùn)練過(guò)程 train_step 綁定在一起運(yùn)行,使其合成一個(gè)訓(xùn)練節(jié)點(diǎn),實(shí)現(xiàn)的代碼如下

with tf.control_dependencies([ train_step, ema_op ]):train_op = tf.no_op(name = 'train')

?

另外:

查看某參數(shù)的滑動(dòng)平均值

函數(shù)ema.average(參數(shù)名) --->? 返回 ’ 參數(shù)名 ’ 的滑動(dòng)平均值,

3 示例代碼

# 待優(yōu)化參數(shù)w1,不斷更新w1參數(shù),求w1的滑動(dòng)平均(影子)import tensorflow as tf# 1. 定義變量及滑動(dòng)平均類# 定義一個(gè)32位浮點(diǎn)變量并賦初值為0.0, w1 = tf.Variable(0, dtype=tf.float32)# 輪數(shù)計(jì)數(shù)器,表示NN的迭代輪數(shù),賦初始值為0,同時(shí)不可被優(yōu)化(不參數(shù)訓(xùn)練) global_step = tf.Variable(0, trainable=False)# 設(shè)定衰減率為0.99 MOVING_AVERAGE_DECAY = 0.99# 實(shí)例化滑動(dòng)平均類 ema = tf.train.ExponentialMovingAverage(MOVING_AVERAGE_DECAY, global_step)# ema.apply()函數(shù)中的參數(shù)為待優(yōu)化更新列表 # 每運(yùn)行sess.run(ema_op)時(shí),會(huì)對(duì)函數(shù)中的參數(shù)求算滑動(dòng)平均值 # tf.trainable_variables()函數(shù)會(huì)自動(dòng)將所有待訓(xùn)練的參數(shù)匯總為待列表 # 因該段代碼中僅有w1一個(gè)參數(shù),ema_op = ema.apply([w1])與下段代碼等價(jià) ema_op = ema.apply(tf.trainable_variables())# 2. 查看不同迭代中變量取值的變化。 with tf.Session() as sess:# 初始化init_op = tf.global_variables_initializer()sess.run(init_op)# 用ema.average(w1)獲取w1滑動(dòng)平均值 (要運(yùn)行多個(gè)節(jié)點(diǎn),作為列表中的元素列出,寫在sess.run中)# 打印出當(dāng)前參數(shù)w1和w1滑動(dòng)平均值print("current global_step:", sess.run(global_step))print("current w1", sess.run([w1, ema.average(w1)]))# 參數(shù)w1的值賦為1sess.run(tf.assign(w1, 1))sess.run(ema_op)print("current global_step:", sess.run(global_step))print("current w1", sess.run([w1, ema.average(w1)]))# 更新global_step和w1的值,模擬出輪數(shù)為100時(shí),參數(shù)w1變?yōu)?0, 以下代碼global_step保持為100,每次執(zhí)行滑動(dòng)平均操作,影子值會(huì)更新 sess.run(tf.assign(global_step, 100))sess.run(tf.assign(w1, 10))sess.run(ema_op)print("current global_step:", sess.run(global_step))print("current w1:", sess.run([w1, ema.average(w1)]))# 每次sess.run會(huì)更新一次w1的滑動(dòng)平均值 sess.run(ema_op)print("current global_step:", sess.run(global_step))print("current w1:", sess.run([w1, ema.average(w1)]))sess.run(ema_op)print("current global_step:", sess.run(global_step))print("current w1:", sess.run([w1, ema.average(w1)]))sess.run(ema_op)print("current global_step:" , sess.run(global_step))print("current w1:", sess.run([w1, ema.average(w1)]))sess.run(ema_op)print("current global_step:" , sess.run(global_step))print("current w1:", sess.run([w1, ema.average(w1)]))

運(yùn)行

current global_step: 0 current w1 [0.0, 0.0] current global_step: 0 current w1 [1.0, 0.9] current global_step: 100 current w1: [10.0, 1.6445453] current global_step: 100 current w1: [10.0, 2.3281732] current global_step: 100 current w1: [10.0, 2.955868] current global_step: 100 current w1: [10.0, 3.532206] current global_step: 100 current w1: [10.0, 4.061389]

?

w1 的滑動(dòng)平均值都向參數(shù) w1 靠近。可見,滑動(dòng)平均追隨參數(shù)的變化而變化。

轉(zhuǎn)載于:https://www.cnblogs.com/gengyi/p/9901502.html

總結(jié)

以上是生活随笔為你收集整理的神经网络优化(二) - 滑动平均的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。