激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - TensorFlow 滑動平均的示例代碼

TensorFlow 滑動平均的示例代碼

2021-03-06 00:15疊加態的貓 Python

這篇文章主要介紹了TensorFlow 滑動平均的示例代碼,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

滑動平均會為目標變量維護一個影子變量,影子變量不影響原變量的更新維護,但是在測試或者實際預測過程中(非訓練時),使用影子變量代替原變量。

1、滑動平均求解對象初始化

?
1
ema = tf.train.ExponentialMovingAverage(decay,num_updates)

參數decay

`shadow_variable = decay * shadow_variable + (1 - decay) * variable`

參數num_updates

`min(decay, (1 + num_updates) / (10 + num_updates))`

2、添加/更新變量

添加目標變量,為之維護影子變量

注意維護不是自動的,需要每輪訓練中運行此句,所以一般都會使用tf.control_dependencies使之和train_op綁定,以至于每次train_op都會更新影子變量

?
1
ema.apply([var0, var1])

3、獲取影子變量值

這一步不需要定義圖中,從影子變量集合中提取目標值

?
1
sess.run(ema.average([var0, var1]))

4、保存&載入影子變量

我們知道,在TensorFlow中,變量的滑動平均值都是由影子變量所維護的,如果你想要獲取變量的滑動平均值需要獲取的是影子變量而不是變量本身。

保存影子變量

建立tf.train.ExponentialMovingAverage對象后,Saver正常保存就會存入影子變量,命名規則是"v/ExponentialMovingAverage"對應變量”v“

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import tensorflow as tf
if __name__ == "__main__":
 
  v = tf.Variable(0.,name="v")
 
  #設置滑動平均模型的系數
 
  ema = tf.train.ExponentialMovingAverage(0.99)
 
  #設置變量v使用滑動平均模型,tf.all_variables()設置所有變量
 
  op = ema.apply([v])
 
  #獲取變量v的名字
 
  print(v.name)
 
  #v:0
 
  #創建一個保存模型的對象
 
  save = tf.train.Saver()
 
  sess = tf.Session()
 
  #初始化所有變量
 
  init = tf.initialize_all_variables()
 
  sess.run(init)
 
  #給變量v重新賦值
 
  sess.run(tf.assign(v,10))
 
  #應用平均滑動設置
 
  sess.run(op)
 
  #保存模型文件
 
  save.save(sess,"./model.ckpt")
 
  #輸出變量v之前的值和使用滑動平均模型之后的值
 
  print(sess.run([v,ema.average(v)]))
 
  #[10.0, 0.099999905]

載入影子變量并映射到變量

利用了Saver載入模型的變量名映射功能,實際上對所有的變量都可以如此操作『TensorFlow』模型載入方法匯總

?
1
2
3
4
5
6
7
8
9
10
11
12
13
v = tf.Variable(1.,name="v")
 
#定義模型對象
 
saver = tf.train.Saver({"v/ExponentialMovingAverage":v})
 
sess = tf.Session()
 
saver.restore(sess,"./model.ckpt")
 
print(sess.run(v))
 
#0.0999999 

這里特別需要注意的一個地方就是,在使用tf.train.Saver函數中,所傳遞的模型參數是{"v/ExponentialMovingAverage":v}而不是{"v":v},如果你使用的是后面的參數,那么你得到的結果將是10而不是0.09,那是因為后者獲取的是變量本身而不是影子變量。

使用這種方式來讀取模型文件的時候,還需要輸入一大串的變量名稱。

variables_to_restore函數的使用

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
v = tf.Variable(1.,name="v")
 
#滑動模型的參數的大小并不會影響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會識別網絡中的變量,并自動生成影子變量名。

通過使用variables_to_restore函數,可以使在加載模型的時候將影子變量直接映射到變量的本身,所以我們在獲取變量的滑動平均值的時候只需要獲取到變量的本身值而不需要去獲取影子變量。

5、官方文檔例子

官方文檔中將每次apply更新就會自動訓練一邊模型,實際上可以反過來兩者關系,《tf實戰google》P128中有示例

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| 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(位于函數體外面),則強行將兩個variable的輸出過程化為節點,綁定給參數更新步驟

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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之后會把Variable轉換為Tensor并入圖中,
 
        # 否則由于Variable是獨立于Session的,不會被圖控制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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://www.cnblogs.com/hellcat/p/8583379.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲精品av在线 | 黄色av网站免费 | 色婷婷av一区二区三区久久 | 国产成人强伦免费视频网站 | 欧美女同hd | 亚洲欧美成aⅴ人在线观看 免费看欧美黑人毛片 | 一级毛片在线免费观看视频 | 手机国产乱子伦精品视频 | 九九热在线视频观看这里只有精品 | 欧美性生活网站 | 国产在线地址 | 精品国产一区二区亚洲人成毛片 | a一级黄色毛片 | 中国久久久 | 亚洲成人激情在线 | 噜噜在线视频 | 在线观看国产 | 精品爱爱 | 99视频观看 | 性aaa| 色婷婷综合久久久久中文 | 成人短视频在线播放 | 操操插插 | 亚洲一区二区网址 | 91久久九色| 欧美一区二区黄色片 | 日本在线播放一区二区三区 | 免费视频观看 | 亚洲片在线 | 欧美一区黄 | 精品一区二区三区中文字幕老牛 | 成人在线免费观看视频 | 男女羞羞视频 | 成年免费视频黄网站在线观看 | 黄色网电影| 精品久久久久久久久久久久久久久久久久久 | 久久久久国产成人精品亚洲午夜 | 国产日韩在线观看一区 | 羞羞羞网站 | 操碰97 | 免费一级特黄欧美大片勹久久网 |