赞
踩
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()
参考资料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])来自己构造。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。