2018-04-06

作者: 优秀的莱恩 | 来源:发表于2018-04-06 16:07 被阅读7次

    TensorFlow中的自动梯度
    首先优化函数的定义就是前面一部分opt
    =tf.train.GradientDescentOptimizer(learning_rate),定义好优化函数之后,可以通过grads_and_vars = opt.compute_gradients(loss, <list of variables>)来计算loss对于一个变量列表里面每一个变量的梯度,得到的grads_and_vars是一个list of tuples,list中的每个tuple都是由(gradient, variable)构成的,我们可以通过get_grads_and_vars = [(gv[0], gv[1]) for gv in grads_and_vars]将其分别取出来,然后通过opt.apply_gradients(get_grads_and_vars)来更新里面的参数,下面我们举一个小例子。

    import tensorflow as tf
    
    x = tf.Variable(5, dtype=tf.float32)
    y = tf.Variable(3, dtype=tf.float32)
    
    z = x**2 + x * y + 3
    
    sess = tf.Session()
    # initialize variable
    sess.run(tf.global_variables_initializer())
    
    # define optimizer
    optimizer = tf.train.GradientDescentOptimizer(0.1)
    
    # compute gradient z w.r.t x and y
    grads_and_vars = optimizer.compute_gradients(z, [x, y])
    
    # fetch the variable
    get_grads_and_vars = [(gv[0], gv[1]) for gv in grads_and_vars]
    
    
    # dz/dx = 2*x + y= 13
    # dz/dy = x = 5
    print('grads and variables')
    print('x: grad {}, value {}'.format(
    sess.run(get_grads_and_vars[0][0]), sess.run(get_grads_and_vars[0][1])))
    
    print('y: grad {}, value {}'.format(
    sess.run(get_grads_and_vars[1][0]), sess.run(get_grads_and_vars[1][1])))
    
    print('Before optimization')
    print('x: {}, y: {}'.format(sess.run(x), sess.run(y)))
    
    # optimize parameters
    opt = optimizer.apply_gradients(get_grads_and_vars)
    # x = x - 0.1 * dz/dx = 5 - 0.1 * 13 = 3.7
    # y = y - 0.1 * dz/dy = 3 - 0.1 * 5 = 2.5
    print('After optimization using learning rate 0.1')
    sess.run(opt)
    print('x: {:.3f}, y: {:.3f}'.format(sess.run(x), sess.run(y)))
    sess.close()
    
    image.png

    在实际中,我们当然不用手动更新参数,optimizer类可以帮我们自动更新,另外还有一个函数也能够计算梯度。

     tf.gradients(ys, xs, grad_ys=None, name='gradients', colocate_gradients_with_ops=False, gate_gradients=False, aggregation_method=None)
    
    这个函数会返回list,list的长度就是xs的长度,list中每个元素都是 image.png

    实际运用: 这个方法对于只训练部分网络非常有用,我们能够使用上面的函数只对网络中一部分参数求梯度,然后对他们进行梯度的更新。

    链接:https://zhuanlan.zhihu.com/p/28924642

    相关文章

      网友评论

        本文标题:2018-04-06

        本文链接:https://www.haomeiwen.com/subject/fcdshftx.html