您当前的位置: 首页 >  tensorflow

Better Bench

暂无认证

  • 1浏览

    0关注

    695博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【北京大学】6 TensorFlow1.x的学习率、滑动平均和正则化实例及实现

Better Bench 发布时间:2020-12-19 21:12:47 ,浏览量:1

目录
  • 1 学习率
    • 1.1 概念
    • 1.2 举例理解
    • 1.3 学习率的选择
  • 2 滑动平均
    • 2.1 概念
    • 2.2 滑动平均的实现
  • 3 正则化
    • 3.1 概念
    • 3.2 实现
    • 3.3 举例
  • 相关笔记

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(欢迎加群讨论学习)
#如有错误还望留言指正,谢谢🌝
import tensorflow as tf
#1. 定义变量及滑动平均类
#定义一个32位浮点变量,初始值为0.0  这个代码就是不断更新w1参数,优化w1参数,滑动平均做了个w1的影子
w1 = tf.Variable(0, dtype=tf.float32)
#定义num_updates(NN的迭代轮数),初始值为0,不可被优化(训练),这个参数不训练
global_step = tf.Variable(0, trainable=False)
#实例化滑动平均类,给衰减率为0.99,当前轮数global_step
MOVING_AVERAGE_DECAY = 0.99
ema = tf.train.ExponentialMovingAverage(MOVING_AVERAGE_DECAY, global_step)#滑动平均
#ema.apply后的括号里是更新列表,每次运行sess.run(ema_op)时,对更新列表中的元素求滑动平均值。
#在实际应用中会使用tf.trainable_variables()自动将所有待训练的参数汇总为列表
#ema_op = ema.apply([w1])
#apply(func [, args [, kwargs ]]) 函数用于当函数参数已经存在于一个元组或字典中时,间接地调用函数。
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滑动平均值 (要运行多个节点,作为列表中的元素列出,写在sess.run中)
   #打印出当前参数w1和w1滑动平均值
   print "current global_step:", sess.run(global_step)#打印global_step
   print "current w1", sess.run([w1, ema.average(w1)]) #计算滑动平均
   
   # 参数w1的值赋为1
   #tf.assign(A, new_number): 这个函数的功能主要是把A的值变为new_number
   sess.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的值,模拟出轮数为100时,参数w1变为10, 以下代码global_step保持为100,每次执行滑动平均操作,影子值会更新 
   sess.run(tf.assign(global_step, 100))  #设置global_step为100
   sess.run(tf.assign(w1, 10))#设置W1为10
   sess.run(ema_op)#运行ema_op
   print "current global_step:", sess.run(global_step)#打印
   print "current w1:", sess.run([w1, ema.average(w1)])  #打印     
   
   # 每次sess.run会更新一次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)])
   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)])
#更改MOVING_AVERAGE_DECAY 为 0.1  看影子追随速度
"""
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]
current global_step: 100
current w1: [10.0, 4.547275]
current global_step: 100
current w1: [10.0, 4.9934072]
"""
3 正则化 3.1 概念

利用正则化缓解过拟合:正则化在损失函数中引入模型复杂度指标,利用给W加权值,弱化了训练数据的噪声(一般不正则化b偏置) 在这里插入图片描述

3.2 实现
#正则化法有两种,l1和l2,在使用时,二选一
tf.contrib.layers.l1_regularizer(regularizer)(w)
l2_regularizer(regularizer)(w)

# 使用方式如下
tf.add_to_collection('losses', tf.contrib.layers.l1_regularizer(regularizer)(w))
loss = cem +tf.add_n(tf.get_collection('losses'))
3.3 举例

数据X[x0,x1]为正态分布随机点,标注Y_当 x 0 2 + x 1 2 < 2 x_0^2 + x_1^2

关注
打赏
1665674626
查看更多评论
立即登录/注册

微信扫码登录

0.1810s