目录
1 学习率
1.1 概念
学习率(Learning_rate):每次参数更新的幅度
1.2 举例理解
代码实现
#coding:utf-8
#设损失函数 loss=(w+1)^2, 令w初值是常数5。反向传播就是求最优w,即求最小loss对应的w值
import tensorflow as tf
#定义待优化参数w初值赋5
w = tf.Variable(tf.constant(5, dtype=tf.float32))
#定义损失函数loss
loss = tf.square(w+1)#tf.square()是对a里的每一个元素求平方
#定义反向传播方法
train_step = tf.train.GradientDescentOptimizer(0.2).minimize(loss)
#生成会话,训练40轮
with tf.Session() as sess:
init_op=tf.global_variables_initializer()#初始化
sess.run(init_op)#初始化
for i in range(40):#训练40轮
sess.run(train_step)#训练
w_val = sess.run(w)#权重
loss_val = sess.run(loss)#损失函数
print("After %s steps: w is %f, loss is %f." % (i, w_val,loss_val))#打印
1.3 学习率的选择
学习率大了震荡不收敛,学习率小了,收敛速度慢。
因此提出指数衰减学习率
learning_rate =LEARNING_RATE_BASE*LEARNING_RATE_OECAY
#其中LEARNING_RATE_OECAY = Batch_size/Learning_rate_step(运行了几轮/多少轮更新一次学习率)其中Learning_rate_size 也等于总样本数/Batch_size
#coding:utf-8
#设损失函数 loss=(w+1)^2, 令w初值是常数10。反向传播就是求最优w,即求最小loss对应的w值
#使用指数衰减的学习率,在迭代初期得到较高的下降速度,可以在较小的训练轮数下取得更有收敛度。
import tensorflow as tf
LEARNING_RATE_BASE = 0.1 #最初学习率
LEARNING_RATE_DECAY = 0.99 #学习率衰减率
LEARNING_RATE_STEP = 1 #喂入多少轮BATCH_SIZE后,更新一次学习率,一般设为:总样本数/BATCH_SIZE
#运行了几轮BATCH_SIZE的计数器,初值给0, 设为不被训练
global_step = tf.Variable(0, trainable=False)
#定义指数下降学习率
learning_rate = tf.train.exponential_decay(LEARNING_RATE_BASE, global_step, LEARNING_RATE_STEP, LEARNING_RATE_DECAY, staircase=True)
#定义待优化参数,初值给10
w = tf.Variable(tf.constant(5, dtype=tf.float32))
#定义损失函数loss
loss = tf.square(w+1)#tf.square()是对a里的每一个元素求平方
#定义反向传播方法 使用minimize()操作,该操作不仅可以优化更新训练的模型参数,也可以为全局步骤(global_step)计数
train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss, global_step=global_step)
#生成会话,训练40轮
with tf.Session() as sess:
init_op=tf.global_variables_initializer()#初始化
sess.run(init_op)
for i in range(40):#40次
sess.run(train_step)#训练
learning_rate_val = sess.run(learning_rate)#学习率
global_step_val = sess.run(global_step)#计算获取计数器的值
w_val = sess.run(w)#计算权重
loss_val = sess.run(loss)#计算损失函数
#打印相应数据
print ("After %s steps: global_step is %f, w is %f, learning rate is %f, loss is %f" % (i, global_step_val, w_val, learning_rate_val, loss_val))
2 滑动平均
2.1 概念
滑动平均(影子值):记录了每个参数一段时间内国王值的平均,增加了模型泛化性。
针对权重和偏(像是给参数加了影子,参数变化,影子缓慢追随)
举例如下
2.2 滑动平均的实现
核心代码
ema = tf.train.ExponentialMovingAverage(衰减率MOVING_AVERAGE_DECAY, 当前轮数global_step)#滑动平均
ema_op = ema.apply(tf.trainable_variables())#每运行此句,所有待优化的参数求滑动平均
# 通常我们把滑动平均与训练过程绑定在一起,使它们合成一个训练节点。如下所示
with tf.control_dependencies([train_step,ema_op]):
train_op = tf.no_op(name='train')
# ema.average(参数名)查看某参数的滑动平均值
完整的代码
#coding:utf-8
#tensorflow学习笔记(北京大学) tf4_6.py 完全解析 滑动平均
#QQ群:476842922(欢迎加群讨论学习)
#如有错误还望留言指正,谢谢