• tensorflow常用函数(二)


    一、变量相关的函数

    1)tf.train.list_variables(ckpt_dir_or_file)    Returns list of all variables in the checkpoint

    2)tf.global_variables_initializer()   用于初始化所有的变量(GraphKeys.VARIABLES),替代 tf.initialize_all_variables()。

    3)tf.Variable(initial_value=None, trainable=True, collections=None, validate_shape=True, caching_device=None, name=None, variable_def=None, dtype=None, expected_shape=None, import_scope=None) 

    trainable:   默认为`True`,则默认值也将变量添加到图形中集合`GraphKeys.TRAINABLE_VARIABLES`。#这个集合用作“Optimizer”类使用的默认变量列表。

    collections:图表集合键的列表。新的变量被添加到这些集合。默认为`[GraphKeys.GLOBAL_VARIABLES]`)

    用于生成一个初始值为initial-value的变量;必须指定初始化值

    4)tf.get_variable(name,shape=None,dtype=None,initializer=None,regularizer=None,trainable=True,collections=None,caching_device=None,partitioner=None,validate_shape=True,use_resource=None,custom_getter=None,constraint=None)   

    获取已存在的变量(要求不仅名字,而且初始化方法等各个参数都一样),如果不存在,就新建一个;可以用各种初始化方法,不用明确指定值。

    推荐使用tf.get_variable():

    • 初始化方便
    • 方便共享变量,因为tf.get_variable()会检查当前命名空间下是否存在同样name的变量,可以方便共享变量。而tf.Variable每次都会新建一个变量

    需要注意的是tf.get_variable(),要配合reusetf.variable_scope()使用,对于get_variable()来说,如果已经创建的变量对象,就把那个对象返回,如果没有创建变量对象的话,就创建一个新的。

    5)tf.name_scope()  此函数作用是共享变量。在一个作用域scope内共享一些变量,简单来说,就是给变量名前面加个变量空间名,只限于tf.Variable()的变量。

    6)tf.variable_scope()  和tf.name_scope()作用一样,不过包括tf.get_variable()的变量和tf.Variable()的变量。在同一个程序中多次调用,在第一次调用之后需要将reuse参数设置为True,简而言之,reuse=False时,在scope下面创建变量,reuse=True时,在scope下面获取已有变量。

    with tf.variable_scope("one"):
        a = tf.get_variable("v", [1]) #默认reuse=False,创建了一个变量,a.name == "one/v:0"
    
    with tf.variable_scope("one"):
        b = tf.get_variable("v", [1]) #创建两个名字一样的变量会报错 ValueError: Variable one/v already exists ,这个时候reuse=False,你只能新创建变量,不能get已有变量
    
    with tf.variable_scope("one", reuse = True): #注意reuse的作用。
        c = tf.get_variable("v", [1]) #c.name == "one/v:0" 成功共享引用了已有变量,因为设置了reuse=True

     7) tf.train.init_from_checkpoint (ckpt_dir_or_file,assignment_map)  #从checkpoint中加载已训练好的参数
        ckpt_dir_or_file:.ckpt模型的路径        assignment_map:字典类型,key为要恢复的变量名

     

    二、梯度相关

     1)global_step   

          global_step在训练中是计数的作用,每训练一个batch就加1。主要在滑动平均、优化器、指数衰减学习率等方面有用到。实际意义就是代步全局的步数,像一个钟表一样告知优化函数在进行到多少步应该进行什么操作。例如:指数衰减的学习率就是随着迭代步数的增加而逐步衰减的。

    2)tf.gradients()

     计算梯度的函数,要注意的是,xs中的x必须要与ys相关,不相关的话,会报错。

    w1 = tf.Variable([[1,2]])
    
    res = tf.matmul(w1,[[2],[1]])
    
    grads = tf.gradients(res,w1)
    
    with tf.Session() as sess:
        tf.global_variables_initializer().run()
        print(sess.run(grads))
    
    因为res=2*x+y  ,所以
    返回结果:[2,1]

     3)tf.clip_by_global_norm  (t_list, clip_norm, use_norm=None, name=None)  梯度截取函数,梯度截取主要是为了防止梯度爆炸

        t_list 是梯度张量, clip_norm 是截取的比率

         截取公式t_list[i] * clip_norm / max(global_norm, clip_norm)

      其中global_norm = sqrt(sum([l2norm(t)**2 for t in t_list])),global_norm 是所有梯度的平方和,如果 clip_norm > global_norm ,就不进行截取

     

     三、优化相关

    1)  tf.train.GradientDescentOptimizer()  使用随机梯度下降算法,使参数沿着 梯度的反方向,即总损失减小的方向移动,实现更新参数

    minimize()用法

    opt = GradientDescentOptimizer(learning_rate=0.1)
    # Add Ops to the graph to minimize a cost by updating a list of variables.
    # "cost" is a Tensor, and the list of variables contains tf.Variable objects.
    opt_op = opt.minimize(cost, var_list=<list of variables>)
    # Execute opt_op to do one step of training:
    opt_op.run()

     minimize包含两个步骤:

    ① 梯度计算
    ② 将计算出来的梯度应用到变量的更新中

    这两个步骤也可以拆开使用,拆开的好处是,可以对计算的梯度进行限制,防止梯度消失和爆炸。

     创建一个optimizer.
    opt = GradientDescentOptimizer(learning_rate=0.1)
     
    # 计算<list of variables>相关的梯度
    grads_and_vars = opt.compute_gradients(loss, <list of variables>)
     
    # grads_and_vars为tuples (gradient, variable)组成的列表。
    #对梯度进行想要的处理,比如cap处理
    capped_grads_and_vars = [(MyCapper(gv[0]), gv[1]) for gv in grads_and_vars]
     
    # 令optimizer运用capped的梯度(gradients)
    opt.apply_gradients(capped_grads_and_var
    1. 使用函数compute_gradients()计算梯度
    2.  按照自己的愿望处理梯度
    3.  使用函数apply_gradients()应用处理过后的梯度

    2) tf.train.AdamOptimizer()    是利用自适应学习率的优化算法

      Adam 算法和随 机梯度下降算法不同。随机梯度下降算法保持单一的学习率更新所有的参数,学习率在训练过程中并不会改变。而 Adam 算法通过计算梯度的一阶矩估计和二 阶矩估计而为不同的参数设计独立的自适应性学习率,也就是学习率可以动态调整。


    四、其它
    1)tf.control_dependencies(control_inputs)    指定某些操作执行的依赖关系,回一个控制依赖的上下文管理器,使用with关键字可以让在这个上下文环境中的操作都在control_inputs 执行。
    with tf.control_dependencies([train_step, variable_averages_op]):
        train_op = tf.no_op(name='train')

    train_op运行之前必须先执行train_step,variable_averages_op。tf.no_op()表示执行完 train_step, variable_averages_op 操作之后什么都不做。

    2)tf.nn.dropout(x, keep_prob, noise_shape=None, seed=None, name=None)
       此函数是为了防止在训练中过拟合的操作,将训练输出按一定规则进行变换
    • x:输入
    • keep_prob:保留比例。        取值 (0,1] 。每一个参数都将按这个比例随机变更

     3)tf.layers.dense(

        inputs,     #输入该网络层的数据
        units,       #输出的维度大小,改变inputs的最后一维
        activation=None,    #激活函数,即神经网络的非线性变化,None的话就表示线性 。eg:tf.tanh
        use_bias=True,      #使用bias为True(默认使用),不用bias改成False即可,是否使用偏置项
        kernel_initializer=None,  ##卷积核的初始化器
        bias_initializer=tf.zeros_initializer(),  ##偏置项的初始化器,默认初始化为0
        kernel_regularizer=None,    ##卷积核的正则化,可选
        bias_regularizer=None,    ##偏置项的正则化,可选
        activity_regularizer=None,   ##输出的正则化函数
        kernel_constraint=None,   
        bias_constraint=None,
        trainable=True,
        name=None,  ##层的名字
        reuse=None  ##是否重复使用参数)

    该函数表示添加了一个全连接层。

  • 相关阅读:
    递归
    书评:《C程序设计语言》
    下一代互联网,今日揭开面纱:IPv6真的要来了
    庆祝Alan Mathison Turing(艾伦·图灵)诞辰100周年!
    svn常用命令行和批处理
    ORACLE 9i数据导入到ORACLE 10G中文出现的乱码问题
    Oracle 11G 的客户端,不再支持连接到ORACLE 8I
    DB2 一个汉字的Byte数,太操蛋了
    关于Windows 7 64位下Visual Studio 2010 开发的Asp.net程序连接Oracle 的出现的问题
    Web Frame 跨域调用Session 丢失问题
  • 原文地址:https://www.cnblogs.com/gczr/p/11885901.html
Copyright © 2020-2023  润新知