tensorflow-训练(train)/测试(test)

 

一个TFRecords 文件为一个字符串序列。这种格式并非随机获取,它比较适合大规模的数据流,而不太适合需要快速分区或其他非序列获取方式。

 

操作组

操作

Training

Optimizers,Gradient Computation,Gradient Clipping,Distributed execution

Testing

Unit tests,Utilities,Gradient checking

 

1、优化器(optimizer)

Class tf.train.Optimizer

优化器(optimizers)类的基类。这个类定义了在训练模型的时候添加一个操作的API。你基本上不会直接使用这个类,但是你会用到他的子类比如GradientDescentOptimizer, AdagradOptimizer, MomentumOptimizer.等等这些。

优化器的基类主要实现了两个接口,一是计算损失函数的梯度,二是将梯度作用于变量。tf.train 主要提供了如下的优化函数:

  • tf.train.Optimizer
  • tf.train.GradientDescentOptimizer
  • tf.train.AdadeltaOpzimizer 

    • Ada delta
  • tf.train.AdagradDAOptimizer
  • tf.train.MomentumOptimizer
  • tf.train.AdamOptimizer
  • tf.train.FtrlOptimizer
  • tf.train.ProximalGradientDescentOptimizer
  • tf.train.ProximalAdagradOptimizer
  • tf.train.RMSPropOptimizer

 

2、梯度计算

TensorFlow 同时也提供了给定 TensorFlow 计算图(computation graph)的导数。上节提到的优化器类会自动计算 computation graph 的导数,但用户自定义优化器时,可以使用如下低级别的函数:

  • tf.gradients
  • tf.AggregationMethod
  • tf.stop_gradient
  • tf.hessians

 

3、梯度下降法

Class tf.train.GradientDescentOptimizer

__init__(learning_rate, use_locking=False,name=’GradientDescent’)

作用:创建一个梯度下降优化器对象 
参数: 
learning_rate: A Tensor or a floating point value. 要使用的学习率 
use_locking: 要是True的话,就对于更新操作(update operations.)使用锁 
name: 名字,可选,默认是”GradientDescent”.

函数training()通过梯度下降法为最小化损失函数增加了相关的优化操作,在训练过程中,先实例化一个优化函数,比如 tf.train.GradientDescentOptimizer,并基于一定的学习率进行梯度优化训练:

optimizer = tf.train.GradientDescentOptimizer(learning_rate)

然后,可以设置一个用于记录全局训练步骤的单值。以及使用minimize()操作,该操作不仅可以优化更新训练的模型参数,也可以为全局步骤(global step)计数:

global_step = tf.Variable(0, name='global_step', trainable=False)

train_op = optimizer.minimize(loss, global_step=global_step)

 

4、移动平均(Moving Averages)

一些训练优化算法,比如GradientDescent 和Momentum 在优化过程中便可以使用到移动平均方法。使用移动平均常常可以较明显地改善结果。

tf.train.ExponentialMovingAverage(decay, steps)

tf.train.ExponentialMovingAverage这个函数用于更新参数,就是采用滑动平均的方法更新参数。这个函数初始化需要提供一个衰减速率(decay),用于控制模型的更新速度。这个函数还会维护一个影子变量(也就是更新参数后的参数值),这个影子变量的初始值就是这个变量的初始值,影子变量值的更新方式如下:

shadow_variable = decay * shadow_variable + (1-decay) * variable

shadow_variable是影子变量,variable表示待更新的变量,也就是变量被赋予的值,decay为衰减速率。decay一般设为接近于1的数(0.99,0.999)。decay越大模型越稳定,因为decay越大,参数更新的速度就越慢,趋于稳定。

tf.train.ExponentialMovingAverage这个函数还提供了自动更新decay的计算方式:

decay= min(decay,(1+steps)/(10+steps))

steps是迭代的次数,可以自己设定。

每次更新完以后,影子变量的值更新,varible的值就是你设定的值。如果在下一次运行这个函数的时候你不在指定新的值,那就不变,影子变量更新。如果指定,那就variable改变,影子变量也改变。

示例:

v1 = tf.Variable(0, dtype=tf.float32) 
step = tf.Variable(tf.constant(0)) 
ema = tf.train.ExponentialMovingAverage(0.99, step) 
maintain_average = ema.apply([v1]) 
variables_to_restore = ema.variables_to_restore()
saver = tf.train.Saver(variables_to_restore)

 

5、交叉熵

交叉熵可在神经网络(机器学习)中作为损失函数,p表示真实标记的分布,q则为训练后的模型的预测标记分布,交叉熵损失函数可以衡量p与q的相似性。交叉熵作为损失函数还有一个好处是使用sigmoid函数在梯度下降时能避免均方误差损失函数学习速率降低的问题,因为学习速率可以被输出的误差所控制。tensorflow中自带的函数可以轻松的实现交叉熵的计算。

 

tf.nn.softmax_cross_entropy_with_logits(_sentinel=None, labels=None, logits=None, dim=-1, name=None)

注意:如果labels的每一行是one-hot表示,也就是只有一个地方为1,其他地方为0,可以使用tf.sparse_softmax_cross_entropy_with_logits()

警告

1. 这个操作的输入logits是未经缩放的,该操作内部会对logits使用softmax操作

2. 参数labels,logits必须有相同的形状 [batch_size, num_classes] 和相同的类型(float16, float32, float64)中的一种

参数_sentinel: 一般不使用

labels: labels的每一行labels[i]必须为一个概率分布

logits: 未缩放的对数概率,就是神经网络最后一层的输出,如果有batch的话,它的大小就是[batchsize,num_classes],单样本的话,大小就是num_classes

dims: 类的维度,默认-1,也就是最后一维

name: 该操作的名称

返回值:长度为batch_size的一维Tensor

示例:

labels = [[0.2, 0.3, 0.5],
		  [0.1, 0.6, 0.3]]

logits = [[2, 0.5, 1],
		  [0.1, 1, 3]]

logits_scaled = tf.nn.softmax(logits)
result1 = tf.nn.softmax_cross_entropy_with_logits(labels=labels, logits=logits)
result2 = -tf.reduce_sum(labels * tf.log(logits_scaled), 1)
result3 = tf.nn.softmax_cross_entropy_with_logits(labels=labels, logits=logits_scaled)

with tf.Session() as sess:
	print sess.run(result1)
	print sess.run(result2)
	print sess.run(result3)

>> > [1.41436887  1.66425455]
>> > [1.41436887  1.66425455]
>> > [1.17185783  1.17571414]

labels的每一行是一个概率分布,而logits未经缩放(每行加起来不为1),我们用定义法计算得到交叉熵result2,和套用tf.nn.softmax_cross_entropy_with_logits()得到相同的结果, 但是将缩放后的logits_scaled输tf.nn.softmax_cross_entropy_with_logits(), 却得到错误的结果,所以一定要注意,这个操作的输入logits是未经缩放的。

 

tf.nn.sparse_softmax_cross_entropy_with_logits(_sentinel=None, labels=None, logits=None, name=None)

这个函数与上一个函数十分类似,唯一的区别在于labels.

注意:对于此操作,给定标签的概率被认为是排他的。labels的每一行为真实类别的索引

警告

1. 这个操作的输入logits同样是是未经缩放的,该操作内部会对logits使用softmax操作

2. 参数logits的形状 [batch_size, num_classes] 和labels的形状[batch_size]

返回值:长度为batch_size的一维Tensor, 和label的形状相同,和logits的类型相同。

6、学习率衰减(decaying the learning rate)

tf.train.exponential_decay(learning_rate, global_step,

decay_steps, decay_rate, staircase=False, name=None)      

对学习率进行指数衰退,学习率每decay_steps后乘以decay_rate。

在Tensorflow中,为解决设定学习率(learning rate)问题,提供了指数衰减法来解决。通过tf.train.exponential_decay函数实现指数衰减学习率。

步骤:1.首先使用较大学习率(目的:为快速得到一个比较优的解);

        2.然后通过迭代逐步减小学习率(目的:为使模型在训练后期更加稳定);

 

实现的是如下操作:

decayed_learning_rate=learining_rate*decay_rate^(global_step/decay_steps) 

其中,decayed_learning_rate为每一轮优化时使用的学习率;

      learning_rate为事先设定的初始学习率;

      decay_rate为衰减系数;

      decay_steps为衰减速度。

 

而tf.train.exponential_decay函数则可以通过staircase(默认值为False,当为True时,(global_step/decay_steps)则被转化为整数) ,选择不同的衰减方式。

 

posted on 2017-11-14 11:06  执剑长老  阅读(3625)  评论(0编辑  收藏  举报