1. 程式人生 > >TensorFlow函式之tf.train.ExponentialMovingAverage()

TensorFlow函式之tf.train.ExponentialMovingAverage()

tf.train.ExponentialMovingAverage來實現滑動平均模型。

格式:

tf.train.ExponentialMovingAverage(decay,num_step)

引數說明:

第一個引數:decay,衰減率,一般設定接近1的數。

第二個引數:num_step,動態設定decay的大小。

tf.train.ExponentialMovingAverage使用步驟:

  1. 定義一個滑動平均的類,初始化衰減率(接近1)和控制衰減變數的step:ema = tf.train.ExponentialMovingAverage(0.99, step)
  2. 定義一個更新變數滑動平均的操作:maintain_average_op = ema.apply([變數]) 
  3. 獲取滑動平均之後的取值:通過ema.average(變數)

簡單例子說明函式的用法:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import tensorflow as tf

# 定義一個變數用於計算滑動平均,這個變數的初始值為0,注意這裡手動指定了變數的型別為float32,因為所需要計算滑動平均的變數必須是實數型
v1 = tf.Variable(0, dtype=tf.float32)
# 這裡step變數模擬神經網路函式中迭代的輪數,可以用於動態控制衰減率
step = tf.Variable(0, trainable=False)

# 定義一個滑動平均的類,初始化時給定衰減率(0.99)和控制衰減變數的step
ema = tf.train.ExponentialMovingAverage(0.99, step)
# 定義一個更新變數滑動平均的操作。這裡需要給定一個列表,每次執行這個操作時這個列表中的變數都會更新
maintain_average_op = ema.apply([v1])

with tf.Session() as sess:
    # 初始化所有變數
    init_op = tf.global_variables_initializer()
    sess.run(init_op)

    # 通過ema.average(v1)來獲取滑動平均之後變數的取值。在初始化之後變數v1的值和v1的滑動平均都為0
    print(sess.run([v1, ema.average(v1)]))  # 輸出[0.0, 0.0]

    # 更新變數v1的值到5
    sess.run(tf.assign(v1, 10))
    # 更新vl的值。衰減率為min{0.99 ,(l+step)/(lO+step)= 0.1)=0.l
    # 所以vl的滑動平均會被更新為0.1×0+0.9×5=4.5。
    sess.run(maintain_average_op)
    print(sess.run([v1, ema.average(v1)]))  # 輸出[10.0, 9.0]

輸出為:

[0.0, 0.0]
[10.0, 9.0]