深度学习神经网络 Tensorflow参数优化 之 学习率

#coding:utf-8
#损失函数 loss=(w+1)^2 ,令w初值是常数5 反向传播就是求最优的w,即最小loss对应的w值
#0导入模块,生成模拟数据集。
import tensorflow as tf
import numpy as np
w = tf.Variable(tf.constant(5,dtype=tf.float32))
#2 定义损失函数及反向传播方法
#因为之前我做的测试程序里,初始随机数生成的网络参数计算出的 y 是负的,所以都被计算为1e-12了,根本没法进行下去梯度下降。
#所以需要利用激励函数来进行激励
loss = tf.square(w+1)
train_step = tf.train.GradientDescentOptimizer(0.2).minimize(loss)
#train_step = tf.train.MomentumOptimizer(0.001,0.9).minimize(loss)
#train_step = tf.train.AdamOptimizer(0.001).minimize(loss)

#用会话计算结果,训练STEPS轮
with tf.Session() as sess:
    init_op=tf.global_variables_initializer()
    sess.run(init_op)
    for i in range(40):
        sess.run(train_step)
        w_val = sess.run(w)
        loss_val = sess.run(loss)
        print("After "+str(i)+" training step(s),loss on all data is " + str(loss_val))
        print(w_val)

我们没有训练参数,而是直接把(w+1)^2作为最后的损失函数,通过梯度下降算法来降低损失函数。

注意底下打印之前通过 sess.run(w)等来把w计算出来,否则直接输出w,在这里面只是个计算图。(这里的w是用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)

trainable=False 这样我们就不会在训练的时候尝试更新它的值。

#定义指数下降学习率
learning_rate = tf.train.exponential_decay\
    (LEARNING_RATE_BASE,global_step,LEARNING_RATE_STEP,LEARNING_RATE_DECAY,staircase=True)

学习率通过global_step来进行更新。

train_step = tf.train.GradientDescentOptimizer(0.2).minimize(loss,global_step = global_step)

在后面训练的40轮里:

    for i in range(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 "+str(i)+" training step(s),loss on all data is " + str(loss_val))
        print("learning rate = "+str(learning_rate_val))

注意

train_step = tf.train.GradientDescentOptimizer(0.2).minimize(loss,global_step = global_step)

里面的global_step = global_step作用是让训练时每次训练global_step都增加1。(实现自动加1)

因为这里设置的LEARNING_RATE_STEP = 1,所以说每次训练都会加1。如果设置LEARNING_RATE_STEP = 8,则训练8轮才会加1。我们知道一般把LEARNING_RATE_STEP 设为:总样本数/BATCH_SIZE,就是说假如我们有32组数据,一个BATCH是8个数据,则我们设置LEARNING_RATE_STEP = 4,即四轮以后,训练用的数据就遍历完一遍了,这个时候global_step就加1,表示变化了一次。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dezeming

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值