最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

TensorFlow神經(jīng)網(wǎng)絡(luò)優(yōu)化策略學(xué)習(xí)

 更新時(shí)間:2018年03月09日 15:26:25   作者:marsjhao  
這篇文章主要介紹了TensorFlow神經(jīng)網(wǎng)絡(luò)優(yōu)化策略

在神經(jīng)網(wǎng)絡(luò)模型優(yōu)化的過(guò)程中,會(huì)遇到許多問(wèn)題,比如如何設(shè)置學(xué)習(xí)率的問(wèn)題,我們可通過(guò)指數(shù)衰減的方式讓模型在訓(xùn)練初期快速接近較優(yōu)解,在訓(xùn)練后期穩(wěn)定進(jìn)入最優(yōu)解區(qū)域;針對(duì)過(guò)擬合問(wèn)題,通過(guò)正則化的方法加以應(yīng)對(duì);滑動(dòng)平均模型可以讓最終得到的模型在未知數(shù)據(jù)上表現(xiàn)的更加健壯。

一、學(xué)習(xí)率的設(shè)置

學(xué)習(xí)率設(shè)置既不能過(guò)大,也不能過(guò)小。TensorFlow提供了一種更加靈活的學(xué)習(xí)率設(shè)置方法——指數(shù)衰減法。該方法實(shí)現(xiàn)了指數(shù)衰減學(xué)習(xí)率,先使用較大的學(xué)習(xí)率來(lái)快速得到一個(gè)比較優(yōu)的解,然后隨著迭代的繼續(xù)逐步減小學(xué)習(xí)率,使得模型在訓(xùn)練后期更加穩(wěn)定,緩慢平滑得達(dá)到最優(yōu)值。

tf.train.exponential_decay(learning_rate, global_step, decay_steps, decay_rate,staircase=False, name=None)

該函數(shù)會(huì)指數(shù)級(jí)減小學(xué)習(xí)率,實(shí)現(xiàn)每輪實(shí)際優(yōu)化時(shí)的衰減后的學(xué)習(xí)率decayed_learning_rate = learning_rate * decay_rate ^ (global_step /decay_steps),learning_rate為設(shè)定的出事學(xué)習(xí)率,decay_rate為衰減系數(shù),decay_steps為衰減速度。如下圖,參數(shù)staircase=False時(shí),學(xué)習(xí)率變化趨勢(shì)為淺色部分;staircase=True時(shí)為深色部分,使得學(xué)習(xí)率變化為階梯函數(shù)(staircase function),這種設(shè)置的常用應(yīng)用場(chǎng)景是每完整地過(guò)完一遍訓(xùn)練數(shù)據(jù),學(xué)習(xí)率就減小一次。

使用示例:learning_rate =tf.train.exponential_decay(starter_learning_rate, global_step, 100000, 0.96,staircase=True)。

二、過(guò)擬合問(wèn)題

1. 過(guò)擬合問(wèn)題及其解決方法

所謂過(guò)擬合問(wèn)題,指的是當(dāng)一個(gè)模型過(guò)于復(fù)雜后,它可以很好地記憶每一個(gè)訓(xùn)練數(shù)據(jù)中隨機(jī)噪聲的部分而忘記了要去學(xué)習(xí)訓(xùn)練數(shù)據(jù)中通用的趨勢(shì)。

為了避免過(guò)擬合問(wèn)題,常用的方法是正則化(Regularization),思想是在損失函數(shù)中加入刻畫(huà)模型復(fù)雜程度的指標(biāo),將優(yōu)化目標(biāo)定義為J(θ)+λR(w) ,其中R(w)刻畫(huà)的是模型的復(fù)雜程度,包括了權(quán)重項(xiàng)w不包括偏置項(xiàng)b,λ表示模型復(fù)雜損失在總損失中的比例。一般來(lái)說(shuō)模型復(fù)雜度只由權(quán)重w決定。常用的刻畫(huà)模型復(fù)雜度的函數(shù)R(w)有兩種,一種是L1正則化:

另一種是L2正則化:

無(wú)論哪種正則化方式,基本思想都是希望通過(guò)限制權(quán)重的大小,使得模型不能任意擬合訓(xùn)練數(shù)據(jù)中的隨機(jī)噪音。區(qū)別:L1正則化會(huì)讓參數(shù)變得更稀疏,L2則不會(huì),所謂參數(shù)變得更稀疏是指會(huì)有更多的參數(shù)變?yōu)?,可達(dá)到類(lèi)似特征選取的功能。實(shí)踐中,也可以將L1正則化和L2正則化同時(shí)使用:

2. 過(guò)擬合問(wèn)題的TensorFlow解決方案

loss =tf.reduce_mean(tf.square(y_ - y) + tf.contrib.layers.l2_regularizer(lambda)(w)

以上就是一個(gè)含L2正則化項(xiàng)的損失函數(shù)。第一部分是均方誤差損失函數(shù),第二部分就是正則化項(xiàng)。lambda參數(shù)表示正則化項(xiàng)的權(quán)重,也就是J(θ)+λR(w)中的λ,w為需要計(jì)算正則化損失的參數(shù)。tf.contrib.layers.l2_regularize()函數(shù)可以計(jì)算給定參數(shù)的L2正則化項(xiàng),類(lèi)似地,tf.contrib.layers.l1_regularizer()可以就是那給定參數(shù)的L1正則化項(xiàng)。

# 比較L1正則化和L2正則化函數(shù)的作用效果 
w = tf.constant([[1.0, -2.0], [-3.0, 4.0]]) 
with tf.Session() as sess: 
  # 0.5*(|1|+|-2|+|-3|+|4|=5.0) 
  print(sess.run(tf.contrib.layers.l1_regularizer(0.5)(w))) # 5.0 
  # 0.5*[(1+4+9+16)/2]=7.5 TensorFlow會(huì)將L2正則化項(xiàng)除以2使得求導(dǎo)的結(jié)果更簡(jiǎn)潔 
  print(sess.run(tf.contrib.layers.l2_regularizer(0.5)(w))) # 7.5 

當(dāng)神經(jīng)網(wǎng)絡(luò)的參數(shù)增多以后,上面的定義損失函數(shù)的方式會(huì)導(dǎo)致loss的定義式很長(zhǎng),可讀性差,另外當(dāng)網(wǎng)絡(luò)結(jié)構(gòu)復(fù)雜后定義網(wǎng)絡(luò)結(jié)構(gòu)的部分和計(jì)算損失函數(shù)的部分可能不在同一個(gè)函數(shù)中,通過(guò)變量方式計(jì)算損失函數(shù)就不方便了。為解決此問(wèn)題,可以使用TensorFlow中提供的集合(collection)。具體實(shí)現(xiàn)見(jiàn)代碼部分。

tf.add_to_collection()將變量加入至指定集合中;tf.get_collection()返回一個(gè)列表,存儲(chǔ)著這個(gè)集合中的元素。

三、滑動(dòng)平均模型

另一個(gè)使模型在測(cè)試數(shù)據(jù)上更健壯(robust)滑動(dòng)平均模型。在采用隨機(jī)梯度下降算法訓(xùn)練神經(jīng)網(wǎng)絡(luò)時(shí),使用滑動(dòng)平均模型在很多應(yīng)用中可提高最終模型在測(cè)試數(shù)據(jù)上的表現(xiàn),GradientDescent和Momentum方式的訓(xùn)練都能夠從ExponentialMovingAverage方法中獲益。

在TensorFlow中提供的tf.train.ExponentialMovingAverage是一個(gè)類(lèi)class,來(lái)實(shí)現(xiàn)滑動(dòng)平均模型。初始化tf.train.ExponentialMovingAverage類(lèi)對(duì)象時(shí),須指定衰減率decay和用于動(dòng)態(tài)控制衰減率的參數(shù)num_updates。tf.train.ExponentialMovingAverage對(duì)每一個(gè)變量維護(hù)一個(gè)影子變量(shadow variable),該影子變量的初始值就是相應(yīng)變量的初始值,每次變量更新時(shí),shadow_variable =decay * shadow_variable + (1 - decay) * variable。從公式中可看出,decay決定了模型更新的速度,decay越大模型越趨于穩(wěn)定,實(shí)際應(yīng)用中decay一般設(shè)置為接近1的數(shù)。num_updates默認(rèn)是None,若設(shè)置了,則衰減率按min(decay, (1 +num_updates) / (10 + num_updates))計(jì)算。

tf.train.ExponentialMovingAverage對(duì)象的apply方法返回一個(gè)對(duì)var_list進(jìn)行更新滑動(dòng)平均的操作,var_list必須是list的Variable或Tensor,該操作執(zhí)行會(huì)更新var_list的影子變量shadowvariable。average方法可獲取滑動(dòng)平均后變量的取值。

四、代碼呈現(xiàn)

1. 復(fù)雜神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)權(quán)重L2正則化方法

import tensorflow as tf 
 
''''' 
# 比較L1正則化和L2正則化函數(shù)的作用效果 
w = tf.constant([[1.0, -2.0], [-3.0, 4.0]]) 
with tf.Session() as sess: 
  # 0.5*(|1|+|-2|+|-3|+|4|=5.0) 
  print(sess.run(tf.contrib.layers.l1_regularizer(0.5)(w))) # 5.0 
  # 0.5*[(1+4+9+16)/2]=7.5 TensorFlow會(huì)將L2正則化項(xiàng)除以2使得求導(dǎo)的結(jié)果更簡(jiǎn)潔 
  print(sess.run(tf.contrib.layers.l2_regularizer(0.5)(w))) # 7.5 
''' 
 
# 復(fù)雜神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)權(quán)重L2正則化方法 
# 定義各層的權(quán)重,并將該權(quán)重的L2正則化項(xiàng)加入至名稱為‘losses'的集合 
def get_weight(shape, lambda1): 
  var = tf.Variable(tf.random_normal(shape), dtype=tf.float32) 
  tf.add_to_collection('losses', tf.contrib.layers.l2_regularizer(lambda1)(var)) 
  return var 
 
x = tf.placeholder(tf.float32, (None, 2)) 
y_ = tf.placeholder(tf.float32, (None, 1)) 
 
layer_dimension = [2,10,5,3,1] # 定義了神經(jīng)網(wǎng)絡(luò)每層的節(jié)點(diǎn)數(shù) 
n_layers = len(layer_dimension) 
 
current_layer = x # 將當(dāng)前層設(shè)置為輸入層 
in_dimension = layer_dimension[0] 
 
# 通過(guò)循環(huán)生成一個(gè)5層全連接的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu) 
for i in range(1,n_layers): 
  out_dimension = layer_dimension[i] 
  weight = get_weight([in_dimension,out_dimension], 0.003) 
  bias = tf.Variable(tf.constant(0.1, shape=[out_dimension])) 
  current_layer = tf.nn.relu(tf.matmul(current_layer, weight) + bias) 
  in_dimension = layer_dimension[i] 
 
mse_loss = tf.reduce_mean(tf.square(y_ - current_layer)) 
tf.add_to_collection('losses', mse_loss) 
loss = tf.add_n(tf.get_collection('losses')) # 包含所有參數(shù)正則化項(xiàng)的損失函數(shù) 

2. tf.train.ExponentialMovingAverage使用樣例

import tensorflow as tf 
 
# tf.train.ExponentialMovingAverage使用樣例 
v1 = tf.Variable(0, dtype=tf.float32) 
step = tf.Variable(0, trainable=False) # 此處step模擬神經(jīng)網(wǎng)絡(luò)迭代的輪數(shù) 
# 定義一個(gè)滑動(dòng)平均的類(lèi)對(duì)象,初始化衰減率decay=0.99,用于動(dòng)態(tài)控制衰減率的參數(shù)num_updates 
ema = tf.train.ExponentialMovingAverage(0.99, num_updates=step) 
 
# apply方法返回一個(gè)對(duì)var_list進(jìn)行更新滑動(dòng)平均的操作,var_list必須是list的Variable或Tensor 
# 該操作執(zhí)行會(huì)更新var_list的影子變量shadow variable 
maintain_averages_op = ema.apply(var_list=[v1]) 
 
with tf.Session() as sess: 
  init_op = tf.global_variables_initializer() 
  sess.run(init_op) 
  # average方法可獲取滑動(dòng)平均后變量的取值 
  print(sess.run([v1, ema.average(v1)])) # [0.0, 0.0] 
 
  sess.run(tf.assign(v1, 5)) 
  # min{0.99, (1+step)(10+step)=0.1}=0.1 
  # 更新v1的滑動(dòng)平均值為 0.1*0.0+0.9*5=4.5 
  sess.run(maintain_averages_op) 
  print(sess.run([v1, ema.average(v1)])) # [5.0, 4.5] 
 
  sess.run(tf.assign(step, 10000)) 
  sess.run(tf.assign(v1, 10)) 
  # min{0.99, (1+step)(10+step)=0.999}=0.99 
  # 更新v1的滑動(dòng)平均值為 0.99*4.5+0.01*10=4.555 
  sess.run(maintain_averages_op) 
  print(sess.run([v1, ema.average(v1)])) # [10.0, 4.5549998] 
 
  # 更新v1的滑動(dòng)平均值為 0.99*4.555+0.01*10=4.60945 
  sess.run(maintain_averages_op) 
  print(sess.run([v1, ema.average(v1)])) # [10.0, 4.6094499] 

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • python?隨機(jī)生成emoji表情的方法實(shí)現(xiàn)

    python?隨機(jī)生成emoji表情的方法實(shí)現(xiàn)

    本文主要介紹了python?隨機(jī)生成emoji表情的方法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-09-09
  • 如何使用Python腳本實(shí)現(xiàn)文件拷貝

    如何使用Python腳本實(shí)現(xiàn)文件拷貝

    這篇文章主要介紹了如何使用Python腳本實(shí)現(xiàn)文件拷貝,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • 使用Python串口實(shí)時(shí)顯示數(shù)據(jù)并繪圖的例子

    使用Python串口實(shí)時(shí)顯示數(shù)據(jù)并繪圖的例子

    今天小編就為大家分享一篇使用Python串口實(shí)時(shí)顯示數(shù)據(jù)并繪圖的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-12
  • Pytest運(yùn)行及其控制臺(tái)輸出信息

    Pytest運(yùn)行及其控制臺(tái)輸出信息

    這篇文章主要介紹了Pytest運(yùn)行及其控制臺(tái)輸出信息,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • django實(shí)現(xiàn)日志按日期分割

    django實(shí)現(xiàn)日志按日期分割

    這篇文章主要介紹了django實(shí)現(xiàn)日志按日期分割,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-05-05
  • Matplotlib控制坐標(biāo)軸刻度間距與標(biāo)簽實(shí)例代碼

    Matplotlib控制坐標(biāo)軸刻度間距與標(biāo)簽實(shí)例代碼

    在matplotlib中,記號(hào)是圖形兩個(gè)軸上的小標(biāo)記,到目前為止,我們讓matplotlib處理軸圖例上記號(hào)的位置,下面這篇文章主要給大家介紹了關(guān)于Matplotlib控制坐標(biāo)軸刻度間距與標(biāo)簽的相關(guān)資料,需要的朋友可以參考下
    2021-10-10
  • 你可能不知道的Python 技巧小結(jié)

    你可能不知道的Python 技巧小結(jié)

    有許許多多文章寫(xiě)了 Python 中的許多很酷的特性,例如變量解包、偏函數(shù)、枚舉可迭代對(duì)象,但是關(guān)于 Python 還有很多要討論的話題,因此在本文中,我將嘗試展示一些我知道的和在使用的,但很少在其它文章提到過(guò)的特性。那就開(kāi)始吧
    2020-01-01
  • Pyqt5自適應(yīng)布局實(shí)例

    Pyqt5自適應(yīng)布局實(shí)例

    今天小編就為大家分享一篇Pyqt5自適應(yīng)布局實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-12
  • Python的Socket編程過(guò)程中實(shí)現(xiàn)UDP端口復(fù)用的實(shí)例分享

    Python的Socket編程過(guò)程中實(shí)現(xiàn)UDP端口復(fù)用的實(shí)例分享

    這篇文章主要介紹了Python的Socket編程過(guò)程中實(shí)現(xiàn)UDP端口復(fù)用的實(shí)例分享,文中作者用到了Python的twisted異步框架,需要的朋友可以參考下
    2016-03-03
  • python查看模塊,對(duì)象的函數(shù)方法

    python查看模塊,對(duì)象的函數(shù)方法

    今天小編就為大家分享一篇python查看模塊,對(duì)象的函數(shù)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10

最新評(píng)論

根河市| 亚东县| 仪陇县| 临江市| 潮安县| 盱眙县| 禄丰县| 砚山县| 施甸县| 衡东县| 阳原县| 宁城县| 灵石县| 哈尔滨市| 聂荣县| 衡山县| 龙门县| 会宁县| 新巴尔虎右旗| 益阳市| 卢龙县| 什邡市| 靖边县| 镇平县| 方山县| 丹寨县| 洪雅县| 通化市| 镇原县| 吉安县| 响水县| 若尔盖县| 邹城市| 青田县| 扎鲁特旗| 巫溪县| 蒙城县| 城固县| 莲花县| 巨鹿县| 确山县|