Tensorflow的学习率退化和随机初始化

退化学习率

设置学习率的大小,是在精度和速度之间找到一个平衡。如果学习率的值比较大,则训练速度快,但结果的精度不够。如果学习率的值比较小,精度虽然提升了,但训练会花太多时间。

退化学习率又叫学习率衰减, 它的本意是希望在训练过程中对于学习率大和小的优点都能够为我们所用, 也就是当训练刚开始时使用大的学习率加快速度, 训练到一定程度后使用小的学习率来提高精度, 这时可以使用学习率衰减的方法。

exponential_decay(learning_rate,global_step,decay_rate,staircase=False,name=None),学习率的衰减速度是由global_step和decay_steps来决定的。计算公式如下:

decayed_learning_rate=learning_rate*decay_rate^(global_step/decay_step)。staircase值默认为False。当为True,将没有衰减功能,只是使用上面的公式初始化一个学习率的值而已。

1
learning_rate=tf.train.exponential_decay(starter_learning_rate,global_step,100000,0.96)

这种方式定义的学习率就是退化学习率, 它的意思是当前迭代到global_step步, 学习率每一步都按照每10万步缩小到0.96%的速度衰退。

通过增大批次处理样本的数量也可以起到退化学习率的效果。但是这种方法要求训练时的最小批次要与实际应用中的最小批次一致。一旦满足该条件,建议优先选择增大批次数量的方法。因为这样会省去一些开发量和训练中的计算量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import tensorflow as tf

global_step=tf.Variable(0,trainable=False)
#初始学习率为0.1
initial_learning_rate=0.1
#每十次衰减0.9
learning_rate=tf.train.exponential_decay(initial_learning_rate,global_step=global_step,
decay_steps=10,
decay_rate=0.9)
opt=tf.train.GradientDescentOptimizer(learning_rate)
#相当于global_step+1
add_global=global_step.assign_add(1)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(sess.run(learning_rate))
for i in range(20):
g,rate=sess.run([add_global,learning_rate])
print(g,rate)

注意: 这是一种常用的训练策略, 在训练神经网络时, 通常在训练刚开始时使用较大的learning rate, 随着训练的进行, 会慢慢减小learning rate。 在使用时, 一定要把当前迭代次数global_step传进去, 否则不会有退化的功能。

随机初始化

在定义学习参数时,可以通过get_variable和Variable两个方式。在使用get_variable时,tf.get_variable(name,shape,initializer),当然还有其它参数,可以自己上网找一下。参数initializer就是初始化参数。可以去下表中列出的相关函数

初始化为常量

1
2
3
4
5
6
7
8
9
10
11
import tensorflow as tf
value = [0, 1, 2, 3, 4, 5, 6, 7]
init = tf.constant_initializer(value)
x = tf.get_variable('x', shape=[8], initializer=init)
with tf.Session() as sess:
x.initializer.run()
print(x.eval())
#sess.run(tf.global_variables_initializer())
#print(sess.run(x))
#输出:
#[ 0. 1. 2. 3. 4. 5. 6. 7.]

初始化为正态分布

1
2
3
4
5
6
7
8
9
10
11
12
import tensorflow as tf
init_random = tf.random_normal_initializer(mean=0.0, stddev=1.0, seed=None, dtype=tf.float32)
init_truncated = tf.truncated_normal_initializer(mean=0.0, stddev=1.0, seed=None, dtype=tf.float32)

with tf.Session() as sess:
x = tf.get_variable('x', shape=[10], initializer=init_random)
y = tf.get_variable('y', shape=[10], initializer=init_truncated)
x.initializer.run()
y.initializer.run()

print(x.eval())
print(y.eval())

初始化为均匀分布

1
2
3
4
5
6
7
8
9
10
11
import tensorflow as tf

init_uniform = tf.random_uniform_initializer(minval=0, maxval=10, seed=None, dtype=tf.float32
x = tf.get_variable('x', shape=[10], initializer=init_uniform)
with tf.Session() as sess:
x.initializer.run()
print(x.eval())

# 输出结果
# [ 6.93343639 9.41196823 5.54009819 1.38017178 1.78720832 5.38881063
# 3.39674473 8.12443542 0.62157512 8.36026382]
----本文结束,感谢您的阅读。如有错,请指正。----
大哥大嫂过年好!支持我一下呗
0%