当前位置:   article > 正文

深度学习学习笔记——optimizer里的computer_gradients和apply_gradients和tape的函数gradient

apply_gradients

tensorflow中的所有优化器(sgd,adam等)都有这两个函数。
一、computer_gradients

compute_gradients(
    loss,
    var_list=None,
    gate_gradients=GATE_OP,
    aggregation_method=None,
    colocate_gradients_with_ops=False,
    grad_loss=None
)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

功能:计算loss中可训练的var_list中的梯度。
参数:loss,vars
返回值:返回(gradient, variable)对的列表。
二、apply_gradients

apply_gradients(
    grads_and_vars,
    global_step=None,
    name=None
)
  • 1
  • 2
  • 3
  • 4
  • 5

功能:更新参数。
参数:grads_and_vars,(gradient, variable) 对的列表
返回值:.无返回值,把计算出来的梯度更新到变量上去。

三、tf.GradientTape的函数gradient

gradient(target,sources,output_gradients=None,unconnected_gradients=tf.UnconnectedGradients.NONE)
作用:根据tape上面的上下文来计算某个或者某些tensor的梯度

参数:
target: 被微分的Tensor或者Tensor列表,你可以理解为经过某个函数之后的值
sources: Tensors 或者Variables列表(当然可以只有一个值). 你可以理解为函数的某个变量
output_gradients: a list of gradients, one for each element of target. Defaults to None.
unconnected_gradients: a value which can either hold ‘none’ or ‘zero’ and alters the value which will be returned if the target and sources are unconnected. The possible values and effects are detailed in ‘UnconnectedGradients’ and it defaults to ‘none’.
返回值:
一个列表表示各个变量的梯度值,和source中的变量列表一一对应,表明这个变量的梯度。

例子:一个线性回归的例子将损失函数与优化器联系起来

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

TRAIN_STEPS=20

# Prepare train data
train_X = np.linspace(-1, 1, 100)
train_Y = 2 * train_X + np.random.randn(*train_X.shape) * 0.33 + 10

print(train_X.shape)

w=tf.Variable(initial_value=1.0)
b=tf.Variable(initial_value=1.0)

optimizer=tf.keras.optimizers.SGD(0.1)
mse=tf.keras.losses.MeanSquaredError()

for i in range(TRAIN_STEPS):
    print("epoch:",i)
    print("w:", w.numpy())
    print("b:", b.numpy())
    #计算和更新梯度
    with tf.GradientTape() as tape:
        logit = w * train_X + b
        loss=mse(train_Y,logit)
    gradients=tape.gradient(target=loss,sources=[w,b])  #计算梯度
    #print("gradients:",gradients)
    #print("zip:\n",list(zip(gradients,[w,b])))
    optimizer.apply_gradients(zip(gradients,[w,b]))     #更新梯度
"""with tf.GradientTape() as tape:
     logit = w*train_x+b
     loss=tf.reduce_mean(tf.square(train_y-logit)
     gradients=tape.gradient(loss,[w,b])
     w.assign_sub(0.1*w)
     b.assign_sub(0.1*b)
"""


#draw
plt.plot(train_X,train_Y,"+")
plt.plot(train_X,w * train_X + b)
plt.show()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

参考资料1

参考资料2
总结:当我们自己写训练过程而不是用fit函数时,首先用tf.GradientTape来记录求导过程,然后利用tape.gradient(loss,[w,b])分别求得loss对于w和b的梯度,返回值gradients是一个梯度列表,然后再可用assign_sub函数来对w,b实行自更新过程,要注意参数是gradients[i]*lr。也可以用optimizer.apply_gradients(grads_and_vars来把计算出的梯度更新到变量上,无返回值。
注意optimizer要事先定义好且有lr,apply_gradients的参数grads_and_vars是一个关于梯度与变量的元组列表,即是computer_gradients的返回值,也可以用zip(grads,[w,b])来自己构造。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/304408
推荐阅读
相关标签
  

闽ICP备14008679号