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

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
)

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

apply_gradients(
    grads_and_vars,
    global_step=None,
    name=None
)

功能:更新参数。
参数: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
总结:当我们自己写训练过程而不是用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])来自己构造。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值