zoukankan      html  css  js  c++  java
  • 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)则被转化为整数) ,选择不同的衰减方式。

  • 相关阅读:
    项目冲刺-第一天
    第四次个人作业-关于微软必应词典客户端 的案例分析
    第三次作业-结对编程
    学院教师开课管理网站项目
    使用Git进行代码管理的心得--github for windows
    十天冲刺---Day8
    十天冲刺---Day7
    十天冲刺---Day6
    十天冲刺---Day5
    十天冲刺---Day4
  • 原文地址:https://www.cnblogs.com/qjoanven/p/7831459.html
Copyright © 2011-2022 走看看