#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,表示变化了一次。