概述
tensorflow2,通过新建一个 tf.GradientTape() 上下文管理器,在其内部实现 自动微分 求导
关于 自动微分 自行百度
常用方法
创建
__init__(
persistent=False,
watch_accessed_variables=True
)
参数
persistent: 布尔值,用来指定新创建的gradient tape是否是可连续求导。
- 默认False,只能调用一次gradient()函数。
watch_accessed_variables: 布尔值,表明这个gradien tap是不是会自动追踪任何能被训练(trainable)的变量。默认是True。要是为False的话,意味着你需要手动去指定你想追踪的那些变量。
gradient()
在tape上下文中计算某个或者某些tensor的梯度
可以简单理解为:通过自动微分求导
gradient(
target,
sources,
output_gradients=None,
unconnected_gradients=tf.UnconnectedGradients.NONE
)
参数
- target:被微分的Tensor或者Tensor列表
即:函数的结果 - sources:tf.Variable 或者 list(其元素是tf.Variable)。
即:函数的变量
注意: 该参数 影响返回值,- tf.constant()类型,返回为None
- list类型,返回list
- output_gradients:梯度的列表,每个目标元素一个。默认为无。
- unconnected_gradients:一个值,可以保留“无”或“零”,并更改目标和源未连接时将返回的值。可能的值和效果在“ UnconnectedGradients”中详细说明,默认为“ none”。
返回值
一个列表表示各个变量的梯度值,和source中的变量列表一一对应,表明这个变量的梯度
注意: 返回值的类型 与 source 的类型相同,如果source是list,那么返回值也是list
注意: 如果sources形参为tf.constant()类型,返回为None
watch()
追踪某个tensor
watch(tensor)
参数
- tensor:一个Tensor或者一个Tensor列表
例子
定义函数
def fun(x):
return x**3
求梯度
# 如果a为tf.constant()类型,tape.gradient()返回为None
a = tf.Variable(2.0)
with tf.GradientTape() as tape:
# tape.watch(x)
result=fun(a)
# 由于gradient()的sources形参只有一个a,所以返回值也只有一个值
gradients=tape.gradient(result,a)
print("result:",result)
print("gradients:",gradients)
执行结果:
result: tf.Tensor(8.0, shape=(), dtype=float32)
gradients: tf.Tensor(12.0, shape=(), dtype=float32)
练习
将下面代码
gradients=tape.gradient(result,a)
修改成如下代码:
gradients=tape.gradient(result,[a])
观察gradients类型
感谢
https://blog.csdn.net/xierhacker/article/details/53174558