tf.GradientTape()自动微分求导

概述

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


原文出处:/show_1EF4gqBjRRIF.html